'use strict'

const moment = require('moment-timezone');
const CumplimientoLegal = require('../models/cumplimiento_legal');

async function listar(req, res) {
    try {
        const anio = req.body.anio;
        if (!anio) return res.status(400).send({ message: 'El campo anio es requerido' });

        const registros = await CumplimientoLegal.findAll({
            where: { ANIO: anio },
            order: [['PRIORIZACION', 'ASC'], ['ID_CUMPLIMIENTO_LEGAL', 'ASC']]
        });

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

async function crear(req, res) {
    try {
        const entidad = req.body;
        const registro = await CumplimientoLegal.create({
            ANIO: entidad.ANIO,
            OBJETIVO: entidad.OBJETIVO,
            META: entidad.META || null,
            PRIORIZACION: entidad.PRIORIZACION || null,
            ACTIVIDAD: entidad.ACTIVIDAD,
            PRESUPUESTO: entidad.PRESUPUESTO || 0,
            RESPONSABLE: entidad.RESPONSABLE || null,
            FECHA_INICIO: entidad.FECHA_INICIO || null,
            FECHA_TERMINO: entidad.FECHA_TERMINO || null,
            INDICADORES: entidad.INDICADORES || null,
            EVIDENCIA: entidad.EVIDENCIA || null,
            ESTADO: entidad.ESTADO || 'Pendiente',
            FECHA_REGISTRO: moment.utc(moment().tz('America/Guayaquil').format('YYYY-MM-DD HH:mm:ss')).toDate()
        });
        res.status(200).send({ data: registro });
    } catch (e) {
        console.log('Error crear CumplimientoLegal:', e);
        res.status(500).send({ message: e.message });
    }
}

async function actualizar(req, res) {
    try {
        const id = req.params.id;
        await CumplimientoLegal.update(req.body, {
            where: { ID_CUMPLIMIENTO_LEGAL: id }
        });
        res.status(200).send({ data: req.body });
    } catch (e) {
        console.log('Error actualizar CumplimientoLegal:', e);
        res.status(500).send({ message: e.message });
    }
}

async function eliminar(req, res) {
    try {
        const id = req.params.id;
        const eliminado = await CumplimientoLegal.destroy({
            where: { ID_CUMPLIMIENTO_LEGAL: 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 CumplimientoLegal:', 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 anio = registros[0].ANIO;
        const fechaRegistro = moment.utc(moment().tz('America/Guayaquil').format('YYYY-MM-DD HH:mm:ss')).toDate();

        // Cargar existentes del mismo año para detectar duplicados
        const existentes = await CumplimientoLegal.findAll({ where: { ANIO: anio } });
        const mapaExistentes = new Map();
        for (const e of existentes) {
            const clave = e.ACTIVIDAD.trim().toLowerCase().substring(0, 120);
            mapaExistentes.set(clave, e.ID_CUMPLIMIENTO_LEGAL);
        }

        let creados = 0, actualizados = 0;

        for (const entidad of registros) {
            const actividad = (entidad.ACTIVIDAD || '').trim();
            const clave = actividad.toLowerCase().substring(0, 120);
            const datos = {
                OBJETIVO:      entidad.OBJETIVO || '',
                META:          entidad.META || null,
                PRIORIZACION:  entidad.PRIORIZACION || null,
                ACTIVIDAD:     actividad,
                PRESUPUESTO:   entidad.PRESUPUESTO || 0,
                RESPONSABLE:   entidad.RESPONSABLE || null,
                FECHA_INICIO:  entidad.FECHA_INICIO || null,
                FECHA_TERMINO: entidad.FECHA_TERMINO || null,
                INDICADORES:   entidad.INDICADORES || null,
                EVIDENCIA:     entidad.EVIDENCIA || null,
            };

            if (mapaExistentes.has(clave)) {
                await CumplimientoLegal.update(datos, {
                    where: { ID_CUMPLIMIENTO_LEGAL: mapaExistentes.get(clave) }
                });
                actualizados++;
            } else {
                await CumplimientoLegal.create({
                    ANIO: anio, ...datos,
                    ESTADO: 'Pendiente',
                    FECHA_REGISTRO: fechaRegistro
                });
                creados++;
            }
        }

        res.status(200).send({ total: registros.length, creados, actualizados });
    } catch (e) {
        console.log('Error importarMasivo CumplimientoLegal:', e);
        res.status(500).send({ message: e.message });
    }
}

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