'use strict';

const https = require('https');
const http = require('http');
const Usuario = require('../models/usuario');
const Usuario_Rol = require('../models/usuario_rol');
const Historial_Empresa = require('../models/historial_empresa');
const Cargo = require('../models/cargo');

const N8N_WEBHOOK_GERENTE = process.env.N8N_WEBHOOK_GERENTE || 'PEGAR_AQUI_URL_WEBHOOK_N8N_GERENTE';
const N8N_WEBHOOK_JEFE = process.env.N8N_WEBHOOK_JEFE || 'PEGAR_AQUI_URL_WEBHOOK_N8N_JEFE';
const N8N_WEBHOOK_USUARIO = process.env.N8N_WEBHOOK_USUARIO || 'PEGAR_AQUI_URL_WEBHOOK_N8N_USUARIO';

function llamarWebhook(webhookUrl, datos) {
    try {
        const body = JSON.stringify(datos);
        const url = new URL(webhookUrl);
        const lib = url.protocol === 'https:' ? https : http;
        const options = {
            hostname: url.hostname,
            port: url.port || (url.protocol === 'https:' ? 443 : 80),
            path: url.pathname + (url.search || ''),
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': Buffer.byteLength(body)
            }
        };
        const req = lib.request(options, (res) => {
            console.log(`Webhook n8n respondio con status: ${res.statusCode}`);
        });
        req.on('error', (e) => {
            console.error('Error al llamar webhook n8n:', e.message);
        });
        req.write(body);
        req.end();
    } catch (error) {
        console.error('Error al preparar webhook n8n:', error.message);
    }
}

async function notificarJefeNuevoPermiso(idArea) {
    try {
        const jefes = await Usuario.findAll({
            attributes: ['ID_USUARIO', 'NOMBRES', 'CORREO'],
            include: [
                {
                    model: Historial_Empresa,
                    as: 'HISTORIAL_EMPRESA',
                    required: true,
                    where: { ESTADO: true },
                    include: [{
                        model: Cargo,
                        required: true,
                        where: { ID_AREA: idArea }
                    }]
                },
                {
                    model: Usuario_Rol,
                    as: 'USUARIO_ROL',
                    where: { ID_ROL: 3 }
                }
            ]
        });

        for (const jefe of jefes) {
            llamarWebhook(N8N_WEBHOOK_JEFE, {
                nombre: jefe.NOMBRES,
                correo: jefe.CORREO,
                mensaje: 'Tienes una nueva solicitud de permiso pendiente de revision.'
            });
        }
    } catch (error) {
        console.error('Error al notificar jefe:', error);
    }
}

async function notificarUsuarioEstadoPermiso(idUsuario, estado) {
    try {
        const usuario = await Usuario.findOne({
            attributes: ['ID_USUARIO', 'NOMBRES', 'CORREO'],
            where: { ID_USUARIO: idUsuario }
        });

        if (usuario) {
            let mensaje = '';
            switch (estado) {
                case 1:  mensaje = 'Tu permiso ha sido aprobado por el jefe de area. Por favor sube la evidencia.'; break;
                case 3:  mensaje = 'Tu permiso ha sido aprobado y finalizado por TTHH.'; break;
                case 4:  mensaje = 'Tu permiso ha sido rechazado por el jefe de area.'; break;
                case 5:  mensaje = 'Tu permiso ha sido rechazado por TTHH.'; break;
                case 11: mensaje = 'Tu permiso ha sido aprobado por el Gerente.'; break;
                case 12: mensaje = 'Tu permiso ha sido finalizado por el Gerente.'; break;
                case 13: mensaje = 'Tu permiso ha sido rechazado por el Gerente.'; break;
                default: mensaje = 'El estado de tu permiso ha sido actualizado.';
            }
            llamarWebhook(N8N_WEBHOOK_USUARIO, {
                nombre: usuario.NOMBRES,
                correo: usuario.CORREO,
                mensaje
            });
        }
    } catch (error) {
        console.error('Error al notificar usuario:', error);
    }
}

async function verificarJefeEnArea(idArea) {
    try {
        const jefes = await Usuario.findAll({
            attributes: ['ID_USUARIO'],
            include: [
                {
                    model: Historial_Empresa,
                    as: 'HISTORIAL_EMPRESA',
                    required: true,
                    where: { ESTADO: true },
                    include: [{ model: Cargo, required: true, where: { ID_AREA: idArea } }]
                },
                { model: Usuario_Rol, as: 'USUARIO_ROL', required: true, where: { ID_ROL: 3 } }
            ]
        });
        return jefes.length > 0;
    } catch (error) {
        console.error('Error al verificar jefe en area:', error);
        return false;
    }
}

async function notificarGerenteNuevoPermiso(datosPermiso = {}) {
    try {
        const gerentes = await Usuario.findAll({
            attributes: ['ID_USUARIO', 'NOMBRES', 'CORREO'],
            include: [
                { model: Usuario_Rol, as: 'USUARIO_ROL', required: true, where: { ID_ROL: 4 } }
            ]
        });

        for (const gerente of gerentes) {
            llamarWebhook(N8N_WEBHOOK_GERENTE, {
                nombre: gerente.NOMBRES,
                correo: gerente.CORREO,
                solicitante: datosPermiso.solicitante || '',
                tipoPermiso: datosPermiso.tipoPermiso || '',
                mensaje: 'Hay un permiso pendiente de tu aprobacion como Gerente.'
            });
        }
    } catch (error) {
        console.error('Error al notificar gerente:', error);
    }
}

module.exports = {
    notificarJefeNuevoPermiso,
    notificarUsuarioEstadoPermiso,
    notificarGerenteNuevoPermiso,
    verificarJefeEnArea
};
