// 🔗 Configuración de Base de Datos MySQL - Sistema de Transporte
const mysql = require('mysql2/promise');

// Configuración de conexión a la base de datos
const dbConfig = {
    host: process.env.DB_HOST || 'localhost',
    user: process.env.DB_USER || 'root',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_NAME || 'cedah_placas',
    charset: 'utf8mb4',
    timezone: '+00:00'
};

// Configuración para el pool (con opciones válidas)
const poolConfig = {
    ...dbConfig,
    connectionLimit: 10,
    queueLimit: 0
};

// Crear pool de conexiones
let pool = null;

/**
 * Inicializar conexión a la base de datos
 */
async function initDatabase() {
    try {
        console.log('🔗 Inicializando conexión a MySQL...');
        
        // Crear pool de conexiones
        pool = mysql.createPool(poolConfig);
        
        // Probar la conexión
        const connection = await pool.getConnection();
        console.log('✅ Conexión a MySQL establecida exitosamente');
        
        // Verificar que la tabla existe
        const [tables] = await connection.execute(
            "SHOW TABLES LIKE 'placas'"
        );
        
        if (tables.length === 0) {
            console.log('⚠️ Tabla "placas" no encontrada. Ejecutar setup.sql primero.');
            throw new Error('Tabla "placas" no existe en la base de datos');
        }
        
        console.log('✅ Tabla "placas" verificada correctamente');
        
        // Obtener conteo de registros
        const [rows] = await connection.execute('SELECT COUNT(*) as total FROM placas');
        console.log(`📊 Total de placas en la base de datos: ${rows[0].total}`);
        
        connection.release();
        return true;
        
    } catch (error) {
        console.error('❌ Error al conectar con MySQL:', error.message);
        
        // Información adicional para debug
        if (error.code === 'ER_ACCESS_DENIED_ERROR') {
            console.error('🔐 Error de autenticación. Verificar usuario y contraseña.');
        } else if (error.code === 'ECONNREFUSED') {
            console.error('🔌 No se pudo conectar al servidor MySQL. ¿Está ejecutándose?');
        } else if (error.code === 'ER_BAD_DB_ERROR') {
            console.error('🗄️ Base de datos no encontrada. Ejecutar setup.sql primero.');
        }
        
        throw error;
    }
}

/**
 * Obtener una conexión del pool
 */
async function getConnection() {
    if (!pool) {
        throw new Error('Base de datos no inicializada. Llamar initDatabase() primero.');
    }
    return await pool.getConnection();
}

/**
 * Ejecutar una consulta SQL
 */
async function executeQuery(sql, params = []) {
    const connection = await getConnection();
    try {
        const [rows] = await connection.execute(sql, params);
        return rows;
    } finally {
        connection.release();
    }
}

/**
 * Obtener el pool de conexiones directamente (para compatibilidad)
 */
function getPool() {
    if (!pool) {
        throw new Error('Base de datos no inicializada. Llamar initDatabase() primero.');
    }
    return pool;
}

/**
 * Cerrar todas las conexiones
 */
async function closeDatabase() {
    if (pool) {
        console.log('👋 Cerrando conexiones a la base de datos...');
        await pool.end();
        pool = null;
        console.log('✅ Conexiones cerradas correctamente');
    }
}

/**
 * Verificar estado de la conexión
 */
async function healthCheck() {
    try {
        const connection = await getConnection();
        const [rows] = await connection.execute('SELECT 1 as alive');
        connection.release();
        return {
            status: 'connected',
            alive: rows[0].alive === 1,
            timestamp: new Date().toISOString()
        };
    } catch (error) {
        return {
            status: 'error',
            error: error.message,
            timestamp: new Date().toISOString()
        };
    }
}

// Manejo de cierre graceful
process.on('SIGINT', async () => {
    console.log('\n📴 Recibida señal SIGINT, cerrando base de datos...');
    await closeDatabase();
    process.exit(0);
});

process.on('SIGTERM', async () => {
    console.log('\n📴 Recibida señal SIGTERM, cerrando base de datos...');
    await closeDatabase();
    process.exit(0);
});

module.exports = {
    initDatabase,
    getConnection,
    getPool,
    executeQuery,
    closeDatabase,
    healthCheck,
    dbConfig: {
        ...dbConfig,
        password: '***' // Ocultar contraseña en logs
    }
};