const express = require('express');
const mysql = require('mysql2');
const crypto = require('crypto');
const cors = require('cors');
const path = require('path');
const authController = require('./controllers/authController');
const ticketController = require('./controllers/ticketController');

const app = express();


const db = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'ticketera_mm'
});

db.connect((err) => {
    if (err) {
        console.error("❌ Error al conectar a MySQL: " + err.stack);
        return;
    }
    console.log("✅ Conectado a la base de datos MySQL");
});

// 2. MIDDLEWARES
app.use(cors());
app.use(express.json());

// Exponer carpetas estáticas
app.use(express.static(path.join(__dirname, '../frontend')));
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
app.use('/assets', express.static(path.join(__dirname, 'assets')));

// 3. RUTAS DE AUTENTICACIÓN
app.post('/api/auth/login', authController.login);

// 4. RUTAS DE TICKETS
app.post('/api/tickets', ticketController.upload.single('evidencia'), ticketController.crearTicket);
app.get('/api/tickets/resumen', ticketController.obtenerResumen);
app.get('/api/historial', ticketController.obtenerHistorial);
app.get('/api/admin/tickets', ticketController.obtenerTicketsAdmin);
app.post('/api/admin/actualizar/:id', ticketController.actualizarTicket);

// 5. RUTAS DE USUARIOS (CRUD)

app.get('/api/admin/usuarios', (req, res) => {
    const sql = "SELECT id, nombres, apellidos, telefono, empresa, sede, area, correo, usuario, rol FROM usuarios ORDER BY id DESC";
    db.query(sql, (err, results) => {
        if (err) return res.status(500).json({ error: err.message });
        res.json(results);
    });
});


// POST: Crear usuario
app.post('/api/admin/usuarios', (req, res) => {
    const { nombres, apellidos, telefono, empresa, sede, area, correo, usuario, password, rol } = req.body;

    // Aplicamos el algoritmo de hash criptográfico sha-2-512
    const hashedPassword = crypto.createHash('sha512').update(password).digest('hex');

    const sql = `
    INSERT INTO usuarios 
    (nombres, apellidos, telefono, empresa, sede, area, correo, usuario, password, rol, creado_por, modificado_por) 
    VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
    `;

    db.query(
        sql, 
        [nombres, apellidos, telefono, empresa, sede, area, correo, usuario, hashedPassword, rol, "admin", "admin"], 
        (err, result) => {
            if (err) {
                console.error("Error BD:", err);
                // Si el error es por correo o usuario duplicado
                if (err.code === 'ER_DUP_ENTRY') {
                    return res.status(400).json({ error: "El correo o nombre de usuario ya está registrado." });
                }
                // Cualquier otro error
                return res.status(500).json({ error: "Error interno: " + err.message });
            }
            res.json({ mensaje: "Usuario creado correctamente" });
        }
    );
});

// PUT: Actualizar usuario
app.put('/api/admin/usuarios/:id', (req, res) => {
    const { id } = req.params;
    const { nombres, apellidos, telefono, empresa, sede, area, correo, usuario, password, rol } = req.body;

    let sql, params;
    

    if (password && password.trim() !== "") {
        // Aplicamos el algoritmo de hash criptográfico sha-2-512
        const hashedPassword = crypto.createHash('sha512').update(password).digest('hex');
        
        sql = "UPDATE usuarios SET nombres=?, apellidos=?, telefono=?, empresa=?, sede=?, area=?, correo=?, usuario=?, password=?, rol=? WHERE id=?";
        params = [nombres, apellidos, telefono, empresa, sede, area, correo, usuario, hashedPassword, rol, id];
    } else {
        // Si el campo quedó vacío, actualizamos todo EXCEPTO la contraseña
        sql = "UPDATE usuarios SET nombres=?, apellidos=?, telefono=?, empresa=?, sede=?, area=?, correo=?, usuario=?, rol=? WHERE id=?";
        params = [nombres, apellidos, telefono, empresa, sede, area, correo, usuario, rol, id];
    }

    db.query(sql, params, (err) => {
        if (err) {
            console.error("Error BD:", err);
           
            if (err.code === 'ER_DUP_ENTRY') {
                return res.status(400).json({ error: "El correo o nombre de usuario ya está siendo usado por otra persona." });
            }
            return res.status(500).json({ error: "Error interno: " + err.message });
        }
        res.json({ mensaje: "Usuario actualizado correctamente" });
    });
});


app.listen(3000, () => {
    console.log(`=================================================`);
    console.log(` Servidor de la Mesa de Ayuda (Ticketera M&M)    `);
    console.log(`=================================================`);
    console.log(`✅ Backend corriendo en el puerto 3000`);
    console.log(`🌐 http://localhost:3000/views/login.html`);
    console.log(`=================================================`);
});