const Handlebars = require('handlebars');
const Idioma = require('../models/idioma');
const moment = require('moment');

// Helpers de Handlebars
Handlebars.registerHelper('eq', function(a, b, options) {
    return a === b ? options.fn(this) : options.inverse(this);
});
Handlebars.registerHelper('inc', function(value) {
    return (value ?? 0) + 1;
});

function mapearDatosCV(usuario) {
    let cargo = '';

    if (usuario.USUARIO_ROL && usuario.USUARIO_ROL.length > 0) {
        const sistema = usuario.USUARIO_ROL[0].ROL?.SISTEMA?.DESCRIPCION || '';
        const cargoDesc = usuario.USUARIO_ROL[0].ROL?.DESCRIPCION || '';
        if (sistema && cargoDesc) {
            cargo = sistema.toUpperCase() + ' - ' + cargoDesc.toUpperCase();
        } else if (cargoDesc) {
            cargo = cargoDesc.toUpperCase();
        }
    }

    if (!cargo && usuario.HISTORIAL_EMPRESA && usuario.HISTORIAL_EMPRESA.length > 0) {
        const area = usuario.HISTORIAL_EMPRESA[0].Cargo?.Area?.DESCRIPCION || '';
        const cargoDesc = usuario.HISTORIAL_EMPRESA[0].Cargo?.DESCRIPCION || '';
        if (area && cargoDesc) {
            cargo = area.toUpperCase() + ' - ' + cargoDesc.toUpperCase();
        } else if (cargoDesc) {
            cargo = cargoDesc.toUpperCase();
        }
    }

    let correos = [];
    if (usuario.CORREO) correos.push(usuario.CORREO);
    if (usuario.CORREO_EMPRESARIAL) correos.push(usuario.CORREO_EMPRESARIAL);

    let tieneLicencia = false;
    if (usuario.LICENCIA && Array.isArray(usuario.LICENCIA) && usuario.LICENCIA.length > 0) {
        tieneLicencia = true;
    }

    let academico = [];
    if (usuario.ESTUDIO && usuario.ESTUDIO.length > 0) {
        for (let estudio of usuario.ESTUDIO) {
            let ano = estudio.FECHA_GRADUACION ? moment(estudio.FECHA_GRADUACION).year() : '';
            academico.push({
                nivel: estudio.NIVEL || '',
                institucion: estudio.INSTITUCION || '',
                lugar: estudio.INSTITUCION || '',
                anosAprobados: estudio.ANIOS_ESTUDIO || '',
                titulo: estudio.TITULO || '',
                ano: ano
            });
        }
    }

    let formacion = [];
    if (usuario.CAPACITACION && usuario.CAPACITACION.length > 0) {
        for (let cap of usuario.CAPACITACION) {
            let ano = cap.FECHA_FIN ? moment(cap.FECHA_FIN).year() : '';
            formacion.push({
                curso: cap.EVENTO || '',
                institucion: cap.AUSPICIANTE || '',
                horas: cap.DURACION || '',
                ano: ano
            });
        }
    }

    let experiencia = [];

    if (usuario.EXPERIENCIA_LABORAL && usuario.EXPERIENCIA_LABORAL.length > 0) {
        for (let exp of usuario.EXPERIENCIA_LABORAL) {
            let desde = '', hasta = 'Actual', anos = '';
            if (exp.FECHA_INICIO) {
                desde = moment(exp.FECHA_INICIO).format('DD-MM-YYYY');
                let fechaFin = exp.FECHA_FIN ? moment(exp.FECHA_FIN) : moment();
                if (exp.FECHA_FIN) hasta = moment(exp.FECHA_FIN).format('DD-MM-YYYY');
                let diferencia = fechaFin.diff(moment(exp.FECHA_INICIO), 'years');
                anos = diferencia > 0 ? diferencia + (diferencia > 1 ? ' años' : ' año') : 'Menos de 1 año';
            }
            experiencia.push({ compania: 'Empresa Externa', cargo: exp.CARGO || '', anos, desde, hasta });
        }
    }

    if (usuario.HISTORIAL_EMPRESA && usuario.HISTORIAL_EMPRESA.length > 0) {
        for (let exp of usuario.HISTORIAL_EMPRESA) {
            let cargoTexto = '';
            if (exp.Cargo) {
                cargoTexto = exp.Cargo.DESCRIPCION || '';
                if (exp.Cargo.Area?.DESCRIPCION) cargoTexto += ' - ' + exp.Cargo.Area.DESCRIPCION;
            }
            let desde = '', hasta = 'Actual', anos = '';
            if (exp.FECHA_INGRESO) {
                desde = moment(exp.FECHA_INGRESO).format('DD-MM-YYYY');
                let fechaFin = exp.FECHA_SALIDA ? moment(exp.FECHA_SALIDA) : moment();
                if (exp.FECHA_SALIDA) hasta = moment(exp.FECHA_SALIDA).format('DD-MM-YYYY');
                let diferencia = fechaFin.diff(moment(exp.FECHA_INGRESO), 'years');
                anos = diferencia > 0 ? diferencia + (diferencia > 1 ? ' años' : ' año') : 'Menos de 1 año';
            }
            experiencia.push({ compania: 'PCACOMPANY', cargo: cargoTexto, anos, desde, hasta });
        }
    }

    let fechaNac = usuario.FECHA_NACIMIENTO ? moment(usuario.FECHA_NACIMIENTO).format('DD-MM-YYYY') : '';

    let esHSE = false;
    if (usuario.USUARIO_ROL && usuario.USUARIO_ROL.length > 0) {
        esHSE = usuario.USUARIO_ROL.some(ur => (ur.ROL?.DESCRIPCION || '').toUpperCase().includes('HSE'));
    }

    let infoHSE = null;
    if (esHSE) {
        let licenciasHSE = (usuario.LICENCIA || []).map(l => ({
            tipo: l.TIPO_LICENCIA || '',
            fechaVence: l.FECHA_CADUCIDAD ? moment(l.FECHA_CADUCIDAD).format('DD-MM-YYYY') : ''
        }));
        let liberacionesHSE = (usuario.LIBERACIONES_HSE || []).map(lib => ({
            tipo: lib.TIPO_LIBERACION || '',
            fechaVence: lib.FECHA_EXPIRACION ? moment(lib.FECHA_EXPIRACION).format('DD-MM-YYYY') : ''
        }));
        infoHSE = {
            manejo: !!usuario.MANEJO,
            manejoDefensivo: !!usuario.MANEJO_DEFENSIVO,
            certificadoEmpresa: !!usuario.CERTIFICADO_MANEJO_EMPRESA,
            esquemaVacunacion: !!usuario.ESQUEMA_VACUNACION,
            licencias: licenciasHSE,
            liberaciones: liberacionesHSE
        };
    }

    return {
        cargo,
        nombres: usuario.NOMBRES || '',
        apellidos: usuario.APELLIDOS || '',
        lugarNacimiento: usuario.CANTON?.NOMBRE || '',
        fechaNacimiento: fechaNac,
        nacionalidad: usuario.NACIONALIDAD || '',
        genero: usuario.SEXO || '',
        cedula: usuario.IDENTIFICACION || '',
        tipoSangre: usuario.TIPO_SANGRE || '',
        correo: correos.join('<br>'),
        licenciaConducir: tieneLicencia,
        fotoBase64: convertirFotoBase64(usuario.FOTO),
        academico,
        formacion,
        idiomas: construirIdiomasDesdeUsuario(usuario),
        experiencia,
        esHSE,
        infoHSE
    };
}

function convertirFotoBase64(rutaFoto) {
    if (!rutaFoto || rutaFoto.startsWith('data:image')) return rutaFoto;
    const fs = require('fs');
    const path = require('path');
    try {
        const fullPath = path.join(__dirname, '..', rutaFoto);
        if (!fs.existsSync(fullPath)) return null;
        const buffer = fs.readFileSync(fullPath);
        const mimeType = rutaFoto.endsWith('.png') ? 'image/png' : 'image/jpeg';
        return `data:${mimeType};base64,${buffer.toString('base64')}`;
    } catch (error) {
        return null;
    }
}

function normalizarNivel(nivel) {
    if (!nivel) return null;
    let n = nivel.toString().toUpperCase().trim().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
    if (n === 'A' || n === 'I' || n === 'B') return n;
    if (n.startsWith('AVA')) return 'A';
    if (n.startsWith('INT')) return 'I';
    if (n.startsWith('BAS')) return 'B';
    return null;
}

function construirIdiomasDesdeUsuario(usuario) {
    const idiomasUsuario = usuario.IDIOMA || usuario.Idiomas || [];
    const lista = idiomasUsuario.map(id => ({
        nombre: (id.NOMBRE || '').toUpperCase(),
        niveles: [
            normalizarNivel(id.NIVEL_COMPRENDE),
            normalizarNivel(id.NIVEL_LEE),
            normalizarNivel(id.NIVEL_HABLA),
            normalizarNivel(id.NIVEL_ESCRIBE)
        ]
    }));
    lista.sort((a, b) => a.nombre.localeCompare(b.nombre));
    return lista;
}

const templateHTML = `<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>CV</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { font-family: Calibri, Arial, sans-serif; font-size: 8pt; line-height: 1.15; }
        .cv-container { width: 140mm; margin: 0 auto; padding: 5mm; }
        .section-header {
            background-color: #020659; color: #ffffff; font-weight: bold;
            font-size: 8pt; text-align: center; padding: 6px;
            margin-top: 12px; border: 1px solid #000;
        }
        .main-table { width: 100%; border-collapse: collapse; table-layout: fixed; margin-bottom: 4px; }
        .main-table td, .main-table th { border: 1px solid #000; padding: 3px 4px; vertical-align: middle; word-wrap: break-word; }
        .main-table th { background-color: #020659; color: white; font-weight: bold; font-size: 6pt; padding: 4px; }
        .label-cell, .label-cell-secondary { background-color: #D9D9D9; font-weight: bold; text-align: center; font-size: 6pt; }
        .label-cell-small { background-color: #D9D9D9; text-align: right; font-size: 5pt; }
        .data-cell { background-color: #F2F2F2; font-size: 6pt; }
        .data-cell.center { text-align: center; }
        .photo-cell { width: 100px; padding: 4px; background-color: #F2F2F2; }
        .photo { max-width: 90px; max-height: 120px; }
        .checkbox { padding: 1px 4px; border: 1px solid #666; font-size: 4.5pt; }
        .checkbox.checked { background-color: #020659; color: #fff; }
        .idiomas-table th { font-size: 4.5pt; padding: 2px; }
        .checkbox-cell-small { font-size: 6pt; text-align: center; }
        @page { size: A4; margin: 10mm; }
        @media print { body { -webkit-print-color-adjust: exact; print-color-adjust: exact; } }
    </style>
</head>
<body>
    <div class="cv-container">
        <div class="section-header">DATOS PERSONALES</div>
        <table class="main-table">
            <tr>
                <td colspan="2" class="label-cell">CARGO:</td>
                <td colspan="4" class="data-cell center">{{cargo}}</td>
            </tr>
            <tr>
                <td rowspan="2" class="label-cell" style="width: 15%;">NOMBRES<br>COMPLETOS</td>
                <td colspan="2" class="label-cell-secondary">APELLIDOS</td>
                <td colspan="2" class="label-cell-secondary">NOMBRES</td>
                <td rowspan="5" class="photo-cell">
                    {{#if fotoBase64}}
                    <img src="{{fotoBase64}}" alt="Foto" class="photo">
                    {{else}}
                    <div class="photo-placeholder">foto</div>
                    {{/if}}
                </td>
            </tr>
            <tr>
                <td colspan="2" class="data-cell">{{apellidos}}</td>
                <td colspan="2" class="data-cell">{{nombres}}</td>
            </tr>
            <tr>
                <td rowspan="2" class="label-cell">LUGAR Y<br>FECHA DE<br>NACIMIENTO</td>
                <td class="label-cell-secondary">LUGAR</td>
                <td class="label-cell-secondary">FECHA(DD-MM-AA)</td>
                <td class="label-cell-secondary">NACIONALIDAD</td>
                <td class="label-cell-secondary">GENERO</td>
            </tr>
            <tr>
                <td class="data-cell">{{lugarNacimiento}}</td>
                <td class="data-cell">{{fechaNacimiento}}</td>
                <td class="data-cell">{{nacionalidad}}</td>
                <td class="data-cell">{{genero}}</td>
            </tr>
            <tr>
                <td class="label-cell">CÉDULA DE<br>IDENTIDAD</td>
                <td colspan="2" class="data-cell">{{cedula}}</td>
                <td class="label-cell">CARGO<br>ACTUAL</td>
                <td class="data-cell">{{cargo}}</td>
            </tr>
            <tr>
                <td class="label-cell-small">Tipo de sangre</td>
                <td class="data-cell">{{tipoSangre}}</td>
                <td class="label-cell-small">Correo:</td>
                <td class="data-cell wrap">{{{correo}}}</td>
                <td class="label-cell-small">Licencia:</td>
                <td class="checkbox-cell center">
                    <div class="check-group">
                    <span class="checkbox {{#if licenciaConducir}}checked{{/if}}">SI</span>
                    <span class="checkbox {{#unless licenciaConducir}}checked{{/unless}}">NO</span>
                    </div>
                </td>
            </tr>
            <tr>
                <td class="label-cell-small">Experiencia:</td>
                <td colspan="5" class="data-cell center">{{experienciaTexto}}</td>
            </tr>
        </table>

        <div class="section-header">INFORMACION ACADEMICA</div>
        <table class="main-table">
            <tr>
                <th style="width:15%;">NIVEL</th>
                <th style="width:25%;">NOMBRE DE LA INSTITUCION</th>
                <th style="width:20%;">LUGAR</th>
                <th style="width:15%;">AÑOS APROBADOS</th>
                <th style="width:15%;">TITULO OBTENIDO</th>
                <th style="width:10%;">AÑO</th>
            </tr>
            {{#each academico}}
            <tr>
                <td class="label-cell-secondary">{{nivel}}</td>
                <td class="data-cell">{{institucion}}</td>
                <td class="data-cell">{{lugar}}</td>
                <td class="data-cell">{{anosAprobados}}</td>
                <td class="data-cell">{{titulo}}</td>
                <td class="data-cell">{{ano}}</td>
            </tr>
            {{/each}}
        </table>

        <div class="section-header">FORMACION</div>
        <table class="main-table">
            <tr>
                <th style="width:50%;">CURSOS / SEMINARIO / TALLERES</th>
                <th style="width:30%;">INSTITUCION / LUGAR</th>
                <th style="width:10%;">Nº HORAS</th>
                <th style="width:10%;">AÑO</th>
            </tr>
            {{#each formacion}}
            <tr>
                <td class="data-cell">{{curso}}</td>
                <td class="data-cell">{{institucion}}</td>
                <td class="data-cell center">{{horas}}</td>
                <td class="data-cell center">{{ano}}</td>
            </tr>
            {{/each}}
        </table>

        <div class="section-header">IDIOMAS</div>
        <table class="main-table idiomas-table">
            <tr>
                <th rowspan="2" style="width:12%;">IDIOMAS</th>
                <th colspan="3" style="width:22%;">COMPRENDE</th>
                <th colspan="3" style="width:22%;">LEE</th>
                <th colspan="3" style="width:22%;">HABLA</th>
                <th colspan="3" style="width:22%;">ESCRIBE</th>
            </tr>
            <tr>
                <th>A</th><th>I</th><th>B</th>
                <th>A</th><th>I</th><th>B</th>
                <th>A</th><th>I</th><th>B</th>
                <th>A</th><th>I</th><th>B</th>
            </tr>
            {{#each idiomas}}
            <tr>
                <td class="label-cell-secondary">{{nombre}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[0] 'A'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[0] 'I'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[0] 'B'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[1] 'A'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[1] 'I'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[1] 'B'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[2] 'A'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[2] 'I'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[2] 'B'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[3] 'A'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[3] 'I'}}✓{{/eq}}</td>
                <td class="checkbox-cell-small">{{#eq niveles.[3] 'B'}}✓{{/eq}}</td>
            </tr>
            {{/each}}
        </table>

        <div class="section-header">EXPERIENCIA LABORAL</div>
        <table class="main-table">
            <tr>
                <th style="width:30%;">COMPAÑIA</th>
                <th style="width:25%;">CARGO</th>
                <th style="width:20%;">AÑOS DE EXPERIENCIA</th>
                <th style="width:12.5%;">DESDE</th>
                <th style="width:12.5%;">HASTA</th>
            </tr>
            {{#each experiencia}}
            <tr>
                <td class="data-cell">{{compania}}</td>
                <td class="data-cell">{{cargo}}</td>
                <td class="data-cell center">{{anos}}</td>
                <td class="data-cell center">{{desde}}</td>
                <td class="data-cell center">{{hasta}}</td>
            </tr>
            {{/each}}
        </table>

        {{#if esHSE}}
        <div class="section-header">INFORMACIÓN HSE</div>
        <table class="main-table">
            <tr><th style="width:40%;">ITEM</th><th style="width:60%;">DETALLE</th></tr>
            <tr>
                <td class="label-cell-small">Manejo defensivo</td>
                <td class="checkbox-cell center">
                    <span class="checkbox {{#if infoHSE.manejoDefensivo}}checked{{/if}}">SI</span>
                    <span class="checkbox {{#unless infoHSE.manejoDefensivo}}checked{{/unless}}">NO</span>
                </td>
            </tr>
            <tr>
                <td class="label-cell-small">Certificado de manejo de la empresa</td>
                <td class="checkbox-cell center">
                    <span class="checkbox {{#if infoHSE.certificadoEmpresa}}checked{{/if}}">SI</span>
                    <span class="checkbox {{#unless infoHSE.certificadoEmpresa}}checked{{/unless}}">NO</span>
                </td>
            </tr>
            <tr>
                <td class="label-cell-small">Esquema de vacunación (Otorgado por HSE)</td>
                <td class="checkbox-cell center">
                    <span class="checkbox {{#if infoHSE.esquemaVacunacion}}checked{{/if}}">SI</span>
                    <span class="checkbox {{#unless infoHSE.esquemaVacunacion}}checked{{/unless}}">NO</span>
                </td>
            </tr>
        </table>
        <table class="main-table" style="margin-top:5px;">
            <tr>
                <th style="width:40%;">LICENCIA</th>
                <th style="width:30%;">TIPO</th>
                <th style="width:30%;">FECHA DE VENCIMIENTO</th>
            </tr>
            {{#if infoHSE.licencias.length}}
                {{#each infoHSE.licencias}}
                <tr>
                    <td class="label-cell-secondary">Licencia {{inc @index}}</td>
                    <td class="data-cell center">{{tipo}}</td>
                    <td class="data-cell center">{{fechaVence}}</td>
                </tr>
                {{/each}}
            {{else}}
                <tr><td colspan="3" class="data-cell center">No registra licencias</td></tr>
            {{/if}}
        </table>
        <table class="main-table" style="margin-top:5px;">
            <tr>
                <th style="width:40%;">LIBERACIÓN</th>
                <th style="width:30%;">TIPO</th>
                <th style="width:30%;">FECHA DE EXPIRACIÓN</th>
            </tr>
            {{#if infoHSE.liberaciones.length}}
                {{#each infoHSE.liberaciones}}
                <tr>
                    <td class="label-cell-secondary">Liberación {{inc @index}}</td>
                    <td class="data-cell center">{{tipo}}</td>
                    <td class="data-cell center">{{fechaVence}}</td>
                </tr>
                {{/each}}
            {{else}}
                <tr><td colspan="3" class="data-cell center">No registra liberaciones</td></tr>
            {{/if}}
        </table>
        {{/if}}
    </div>
</body>
</html>`;

// Compilar template una sola vez al cargar el módulo
const compiledTemplate = Handlebars.compile(templateHTML);

async function generarCV(req, res) {
    try {
        const datosUsuario = req.body;

        if (!datosUsuario) {
            return res.status(400).send({ message: 'No se proporcionaron datos del usuario' });
        }

        const idUsuario = datosUsuario.ID_USUARIO;
        if (idUsuario) {
            const idiomasUsuario = await Idioma.findAll({
                where: { ID_USUARIO: idUsuario },
                raw: true
            });
            datosUsuario.IDIOMA = idiomasUsuario;
        }

        const datosMapeados = mapearDatosCV(datosUsuario);
        const html = compiledTemplate(datosMapeados);

        const nombreArchivo = 'CV_' + (datosUsuario.APELLIDOS || '') + '_' + (datosUsuario.NOMBRES || '') + '.html';

        res.setHeader('Content-Type', 'text/html; charset=utf-8');
        res.setHeader('Content-Disposition', 'inline; filename="' + nombreArchivo + '"');
        res.send(html);

    } catch (error) {
        console.error('Error generando CV:', error);
        res.status(500).send({ message: 'Error al generar el CV' });
    }
}

module.exports = { generarCV };
