const { Op } = require('sequelize');
const moment = require('moment-timezone');
const CapacitacionProgramada = require('../models/capacitacion_programada');

async function listar(req, res) {
    try {
        const anio = req.body.anio;
        const mes = req.body.mes || null;
        const estado = req.body.estado || null;
        const palabra = req.body.palabra || '';

        if (!anio) {
            return res.status(400).send({ message: 'El campo anio es requerido' });
        }

        const where = { ANIO: anio };

        if (mes) {
            where.MES = mes;
        }

        if (estado) {
            where.ESTADO = estado;
        }

        if (palabra) {
            where.TEMA = { [Op.substring]: palabra };
        }

        const registros = await CapacitacionProgramada.findAll({
            where,
            order: [
                ['MES', 'ASC'],
                ['FECHA_PROGRAMADA', 'ASC'],
                ['TEMA', 'ASC']
            ]
        });

        res.status(200).send({ data: registros });

    } catch (e) {
        console.log('Error listar CapacitacionProgramada:', e);
        res.status(500).send({ message: e.message });
    }
}

async function crear(req, res) {
    try {
        const entidad = req.body;

        const registro = CapacitacionProgramada.build();
        // Derivar ANIO y MES desde FECHA_PROGRAMADA si no vienen explícitos
        const fechaBase = entidad.FECHA_PROGRAMADA ? new Date(entidad.FECHA_PROGRAMADA + 'T00:00:00') : null;
        registro.ANIO = entidad.ANIO || (fechaBase ? fechaBase.getFullYear() : null);
        registro.MES  = entidad.MES  || (fechaBase ? fechaBase.getMonth() + 1 : null);
        registro.FECHA_PROGRAMADA = entidad.FECHA_PROGRAMADA || null;
        registro.TEMA = entidad.TEMA;
        registro.OBJETIVO = entidad.OBJETIVO || null;
        registro.AREA_RESPONSABLE = entidad.AREA_RESPONSABLE;
        registro.RESPONSABLE = entidad.RESPONSABLE;
        registro.MODALIDAD = entidad.MODALIDAD || null;
        registro.TIPO = entidad.TIPO || null;
        registro.DURACION_HORAS = entidad.DURACION_HORAS || 1;
        registro.CUPO = entidad.CUPO || 1;
        registro.PRESUPUESTO = entidad.PRESUPUESTO || 0;
        registro.ESTADO = entidad.ESTADO || 'Programada';
        registro.DEPARTAMENTO = entidad.DEPARTAMENTO || null;
        registro.TIPO_CAPACITACION = entidad.TIPO_CAPACITACION || null;
        registro.FECHA_EJECUCION = entidad.FECHA_EJECUCION || null;
        registro.COSTO_UNITARIO = entidad.COSTO_UNITARIO || 0;
        registro.CUMPLIMIENTO = entidad.CUMPLIMIENTO || null;
        registro.OBSERVACION = entidad.OBSERVACION || null;
        registro.FECHA_REGISTRO = moment.utc(moment().tz('America/Guayaquil').format('YYYY-MM-DD HH:mm:ss')).toDate();

        const guardado = await registro.save();

        res.status(200).send({ data: guardado });

    } catch (e) {
        console.log('Error crear CapacitacionProgramada:', e);
        res.status(500).send({ message: e.message });
    }
}

async function actualizar(req, res) {
    try {
        const id = req.params.id;
        const entidad = req.body;

        await CapacitacionProgramada.update(entidad, {
            where: { ID_CAPACITACION_PROGRAMADA: id }
        });

        res.status(200).send({ data: entidad });

    } catch (e) {
        console.log('Error actualizar CapacitacionProgramada:', e);
        res.status(500).send({ message: e.message });
    }
}

async function eliminar(req, res) {
    try {
        const id = req.params.id;

        const eliminado = await CapacitacionProgramada.destroy({
            where: { ID_CAPACITACION_PROGRAMADA: id }
        });

        if (eliminado > 0) {
            res.status(200).send({ data: eliminado });
        } else {
            res.status(404).send({ message: 'Registro no encontrado' });
        }

    } catch (e) {
        console.log('Error eliminar CapacitacionProgramada:', e);
        res.status(500).send({ message: e.message });
    }
}

async function importarMasivo(req, res) {
    try {
        const registros = req.body.registros;
        if (!Array.isArray(registros) || registros.length === 0) {
            return res.status(400).send({ message: 'No se recibieron registros para importar' });
        }

        const fechaRegistro = moment.utc(moment().tz('America/Guayaquil').format('YYYY-MM-DD HH:mm:ss')).toDate();

        const datos = registros.map(entidad => {
            const fechaBase = entidad.FECHA_PROGRAMADA ? new Date(entidad.FECHA_PROGRAMADA + 'T00:00:00') : null;
            return {
                ANIO: entidad.ANIO || (fechaBase ? fechaBase.getFullYear() : new Date().getFullYear()),
                MES: entidad.MES || (fechaBase ? fechaBase.getMonth() + 1 : 1),
                FECHA_PROGRAMADA: entidad.FECHA_PROGRAMADA || null,
                TEMA: entidad.TEMA,
                OBJETIVO: entidad.OBJETIVO || null,
                AREA_RESPONSABLE: entidad.AREA_RESPONSABLE || '',
                DEPARTAMENTO: entidad.DEPARTAMENTO || null,
                RESPONSABLE: entidad.RESPONSABLE || '',
                MODALIDAD: entidad.MODALIDAD || null,
                TIPO: entidad.TIPO || null,
                TIPO_CAPACITACION: entidad.TIPO_CAPACITACION || null,
                DURACION_HORAS: entidad.DURACION_HORAS || 1,
                CUPO: entidad.CUPO || 1,
                PRESUPUESTO: entidad.PRESUPUESTO || 0,
                COSTO_UNITARIO: entidad.COSTO_UNITARIO || 0,
                ESTADO: entidad.ESTADO || 'Programada',
                CUMPLIMIENTO: entidad.CUMPLIMIENTO || null,
                OBSERVACION: entidad.OBSERVACION || null,
                FECHA_EJECUCION: entidad.FECHA_EJECUCION || null,
                FECHA_REGISTRO: fechaRegistro
            };
        });

        const creados = await CapacitacionProgramada.bulkCreate(datos);
        res.status(200).send({ data: creados, total: creados.length });

    } catch (e) {
        console.log('Error importarMasivo CapacitacionProgramada:', e);
        res.status(500).send({ message: e.message });
    }
}

module.exports = {
    listar,
    crear,
    actualizar,
    eliminar,
    importarMasivo
};
