const db = require('../config/db');
const multer = require('multer');
const path = require('path');


const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        // Le indicamos la ruta exacta a la carpeta que acabas de crear
        cb(null, path.join(__dirname, '../uploads/evidencias')); 
    },
    filename: function (req, file, cb) {
        // Generamos un nombre único: fecha actual + nombre original
        const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
        cb(null, uniqueSuffix + path.extname(file.originalname)); 
    }
});


exports.upload = multer({ storage: storage });

// 2. Lógica para guardar el ticket en la Base de Datos
exports.crearTicket = (req, res) => {
    // Recibimos los datos de texto
    const { usuario_id, titulo, descripcion, categoria } = req.body;
    
    
    const evidencia = req.file ? `/uploads/evidencias/${req.file.filename}` : null;

    const query = `
        INSERT INTO tickets (usuario_id, titulo, descripcion, categoria, evidencia)
        VALUES (?, ?, ?, ?, ?)
    `;

    db.query(query, [usuario_id, titulo, descripcion, categoria || 'Otro', evidencia], (err, results) => {
        if (err) return res.status(500).json({ error: err.message });
        
        res.status(201).json({ 
            message: 'Ticket registrado exitosamente', 
            ticketId: results.insertId 
        });
    });
};

exports.obtenerResumen = (req, res) => {
    const usuario_id = req.query.usuario_id;
    const periodo = req.query.periodo; 

    let filtroFecha = "";

    // Lógica del filtro
    if (periodo === 'actual') {
        filtroFecha = " AND MONTH(fecha_creacion) = MONTH(CURRENT_DATE()) AND YEAR(fecha_creacion) = YEAR(CURRENT_DATE())";
    } else if (!isNaN(periodo) && periodo >= 1 && periodo <= 12) {
        const mesEspecifico = parseInt(periodo, 10);
        filtroFecha = ` AND MONTH(fecha_creacion) = ${mesEspecifico} AND YEAR(fecha_creacion) = YEAR(CURRENT_DATE())`;
    }

    
    const query = `
        SELECT 
            (SELECT COUNT(*) FROM tickets WHERE usuario_id = ? AND estado = 'Abierto' ${filtroFecha}) as abiertos,
            (SELECT COUNT(*) FROM tickets WHERE usuario_id = ? AND estado = 'En Proceso' ${filtroFecha}) as proceso,
            (SELECT COUNT(*) FROM tickets WHERE usuario_id = ? AND estado = 'Resuelto' ${filtroFecha}) as resueltos,
            (SELECT titulo FROM tickets WHERE usuario_id = ? ${filtroFecha} ORDER BY id DESC LIMIT 1) as ultimo_titulo,
            (SELECT estado FROM tickets WHERE usuario_id = ? ${filtroFecha} ORDER BY id DESC LIMIT 1) as ultimo_estado,
            (SELECT fecha_creacion FROM tickets WHERE usuario_id = ? ${filtroFecha} ORDER BY id DESC LIMIT 1) as ultima_fecha;
    `;


    
    db.query(query, [usuario_id, usuario_id, usuario_id, usuario_id, usuario_id, usuario_id], (err, resultsStats) => {
        if (err) return res.status(500).json({ error: err.message });
        
        // Guardamos los resultados de las estadísticas
        const respuesta = resultsStats[0];

        // SEGUNDA CONSULTA: Buscamos los últimos 3 tickets de este usuario
        const queryRecientes = `
            SELECT id, titulo, estado, prioridad, fecha_creacion 
            FROM tickets 
            WHERE usuario_id = ? 
            ORDER BY id DESC 
            LIMIT 3
        `;

        db.query(queryRecientes, [usuario_id], (err, resultsRecientes) => {
            if (err) return res.status(500).json({ error: err.message });
            
            // Añadimos el array de tickets recientes a la respuesta y enviamos
            respuesta.recientes = resultsRecientes;
            res.json(respuesta);
        });
    });

   
exports.obtenerHistorial = (req, res) => {
    const usuario_id = req.query.usuario_id;


    const query = `
        SELECT id, titulo, categoria, estado, prioridad, fecha_creacion 
        FROM tickets 
        WHERE usuario_id = ? 
        ORDER BY id DESC
    `;

    db.query(query, [usuario_id], (err, results) => {
        if (err) return res.status(500).json({ error: err.message });
        res.json(results); 
    });
};


};

exports.obtenerHistorial = (req, res) => {
    const usuario_id = req.query.usuario_id;

    const query = `
        SELECT id, titulo, categoria, estado, prioridad, fecha_creacion 
        FROM tickets 
        WHERE usuario_id = ? 
        ORDER BY id DESC
    `;

    db.query(query, [usuario_id], (err, results) => {
        if (err) return res.status(500).json({ error: err.message });
        res.json(results);
    });
};

exports.obtenerTicketsAdmin = (req, res) => {
    
    const query = `
        SELECT t.*, u.nombres AS creador_nombre, u.area AS creador_area 
        FROM tickets t 
        INNER JOIN usuarios u ON t.usuario_id = u.id 
        ORDER BY t.fecha_creacion DESC
    `;

    db.query(query, (err, results) => {
        if (err) return res.status(500).json({ error: err.message });
        res.json(results);
    });
};

exports.actualizarTicket = (req, res) => {
    // Añadimos 'observaciones' a lo que recibimos del body
    const { estado, prioridad, observaciones, admin_id } = req.body; 
    const id = req.params.id;

    let query = "";
    let params = [];

    if (estado === 'Resuelto') {
        query = "UPDATE tickets SET estado = ?, prioridad = ?, observaciones = ?, fecha_resolucion = NOW(), resuelto_por = ? WHERE id = ?";
        params = [estado, prioridad, observaciones, admin_id, id];
    } else {
        query = "UPDATE tickets SET estado = ?, prioridad = ?, observaciones = ? WHERE id = ?";
        params = [estado, prioridad, observaciones, id];
    }

    db.query(query, params, (err) => {
        if (err) return res.status(500).json({ error: err.message });
        res.json({ mensaje: "Actualizado correctamente" });
    });
};