// =========================================================
// 0. AUTO-CARGA DE LIBRERÍAS DE PDF
// =========================================================
(function() {
    if (typeof window.jspdf === 'undefined') {
        var scriptPDF = document.createElement('script');
        scriptPDF.src = "https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js";
        scriptPDF.onload = function() {
            var scriptTable = document.createElement('script');
            scriptTable.src = "https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.28/jspdf.plugin.autotable.min.js";
            document.head.appendChild(scriptTable);
        };
        document.head.appendChild(scriptPDF);
    }
})();

// =========================================================
// 1. FUNCIONES ORIGINALES
// =========================================================
function fn_calcular_imc() {
    var talla = ($('#txt_talla').val() == '') ? 0 : $('#txt_talla').val();
    var peso = ($('#txt_peso').val() == '') ? 0 : $('#txt_peso').val();
    talla = Number(talla);
    peso = Number(peso);
    imc = 0;
    if (peso > 0 && talla > 0) imc = (peso / (talla * talla));
    $('#txt_imc').val(imc.toFixed(2));
}

function fn_xhan_listar(op) {
    $('#histo').html('');
    $.post(ruta + 'movimientos/xan/listarh', {
        d1: $('#txt_xhc').val(),
        d2: op
    }, function(data) {
        $('#histo').html(data).modal({ 'keyboard': false });
    });
}

function fn_xan_pdiario_listar() {
    swal({
        title: 'Cargando...',
        text: 'Espere un momento',
        allowOutsideClick: false,
        onOpen: function() {
            swal.showLoading();
            $.ajax({
                url: ruta + 'movimientos/xan/listar_pdiario',
                data: {
                    fecha: $('#txt_fecha').val(),
                    xco: ($('#cbo_xco option:selected').val())
                },
                type: 'post',
                dataType: 'json',
                success: function(data) {
                    $('#xan_pdiario_data_c').DataTable().destroy();
                    $('#xan_pdiario_data_c tbody').html(data[0]);
                    $('#xan_pdiario_data_c').DataTable({
                        "searching": false, "scrollY": "200px", "scrollCollapse": true, "paging": false,
                        "language": { "url": ruta + 'json/Spanish.json' }
                    });

                    $('#xan_pdiario_data_a').DataTable().destroy();
                    $('#xan_pdiario_data_a tbody').html(data[1]);
                    $('#xan_pdiario_data_a').DataTable({
                        "searching": false, "scrollY": ($(window).height() - 435) + "px", "scrollCollapse": true, "paging": false,
                        "language": { "url": ruta + 'json/Spanish.json' },
                        "columnDefs": [{ "defaultContent": "-", "targets": "_all" }]
                    });
                    swal.close();
                }
            });
        }
    });
}

function fn_xan_insertar() {
    var mhtml = '';
    if ($('#txt_peso').val() == '' || $('#txt_peso').val() == 0) mhtml = 'Peso requerido';
    if ($('#txt_talla').val() == '' || $('#txt_talla').val() == 0) mhtml += 'Talla requerida<br>';
    if ($('#txt_pabdominal').val() == '' || $('#txt_pabdominal').val() == 0) mhtml += 'Perimetro Abdominañ requerido<br>';
    if ($('#txt_anamnesis').val() == '') mhtml += 'Anamnesis requerida<br>';
    if ($('#txt_efisico').val() == '') mhtml += 'Examen físico requerido<br>';

    if (mhtml != '') { swal('Alerta', mhtml, 'warning'); return; }

    swal({
        title: '¿Grabar Atención?',
        type: 'question',
        showCancelButton: true,
        confirmButtonText: 'Sí, Grabar',
        cancelButtonText: 'Cancelar',
        preConfirm: function() {
            return $.ajax({
                url: ruta + 'movimientos/xan/insertar',
                data: $('#form_xan').serialize(),
                type: 'post'
            });
        }
    }).then(function() {
        swal('Éxito', 'Grabado correctamente', 'success').then(function() {
            window.location = ruta + 'movimientos/xan/pdiario';
        });
    });
}

function fn_xan_editar() {
    swal({
        title: '¿Grabar Cambios?',
        type: 'question',
        showCancelButton: true,
        confirmButtonText: 'Sí, Grabar',
        preConfirm: function() {
            return $.ajax({
                url: ruta + 'movimientos/xan/editar',
                data: $('#form_xan').serialize(),
                type: 'post'
            });
        }
    }).then(function() {
        swal('Éxito', 'Actualizado correctamente', 'success').then(function() {
            window.location = ruta + 'movimientos/xan/pdiario';
        });
    });
}

// =========================================================
// 2. FUNCIÓN DE FIRMA DIGITAL Y GENERACIÓN PDF
// =========================================================

window.fn_iniciar_proceso_firma = function(dni, nombre, ate_id) {
    if (typeof window.jspdf === 'undefined') {
        alert("Cargando librerías... intente de nuevo en 5 segundos.");
        return;
    }

    swal({
        title: 'Firma Digital',
        html: 'Generar documento firmado para:<br><b>' + nombre + '</b>',
        type: 'info',
        showCancelButton: true,
        confirmButtonText: 'Firmar y Descargar',
        cancelButtonText: 'Cancelar',
        confirmButtonClass: 'btn btn-danger'
    }).then(function(result) {
        
        var confirmado = false;
        if (typeof result === 'object' && result.value) confirmado = true;
        if (result === true) confirmado = true;
        
        if (!confirmado) return;

        // Pedimos contraseña
        swal({
            title: 'Autenticación',
            text: 'Ingrese su Clave de Firma Digital:',
            input: 'password', 
            showCancelButton: true,
            confirmButtonText: 'Validar',
            inputPlaceholder: 'Clave de seguridad'
        }).then(function(resPass) {
            var pass = (typeof resPass === 'object') ? resPass.value : resPass;

            if (!pass) return;

            if (pass !== 'SE121129se') {
                swal('Error', 'Clave Incorrecta', 'error');
            } else {
                obtener_datos_y_generar_pdf(ate_id, dni);
            }
        });
    });
};

function obtener_datos_y_generar_pdf(ate_id, dni) {
    swal({
        title: 'Procesando...',
        text: 'Obteniendo datos...',
        allowOutsideClick: false,
        onOpen: function() { swal.showLoading(); }
    });

    $.ajax({
        url: ruta + 'movimientos/xan/obtener_datos_pdf',
        type: 'POST',
        data: { ate_id: ate_id },
        dataType: 'text',
        success: function(respuestaTexto) {
            try {
                var datos = JSON.parse(respuestaTexto);
                if(datos.status === 'error') {
                    swal('Error', datos.msg, 'error');
                } else {
                    generar_pdf_final(datos, dni);
                    swal.close();
                }
            } catch (e) {
                console.log("Error PHP:", respuestaTexto);
                swal('Error del Servidor', 'Respuesta inválida del servidor.', 'error');
            }
        },
        error: function() {
            swal('Error', 'Fallo de conexión.', 'error');
        }
    });
}

function generar_pdf_final(data, dni) {
    try {
        const { jsPDF } = window.jspdf;
        const doc = new jsPDF();
        const margen = 15;
        let y = 20;

        // --- CABECERA ---
        doc.setFontSize(14); doc.setFont("helvetica", "bold");
        doc.text("CONSULTORIO VISIMAX", margen, y); y += 6;
        doc.setFontSize(10); doc.setFont("helvetica", "normal");
        doc.text("vigoayastah28@yahoo.es | CALLE AGUA MARINA Mz.H LOTE 28 Urb.LOS CEDROS - TRUJILLO", margen, y); y += 12;
        doc.setFontSize(16); doc.setFont("helvetica", "bold");
        doc.text("PARTE DIARIO", margen, y); y += 10;
        doc.setFontSize(10);
        doc.text("FECHA: " + data.fecha, margen, y);
        doc.text("H/C: " + data.hc, 150, y); y += 7;
        doc.text("PACIENTE: " + data.paciente, margen, y);

        // --- TABLA ---
        y += 8;
        doc.autoTable({
            startY: y,
            head: [['EDAD', 'PESO', 'TALLA', 'I.M.C.', 'P. ABDOMINAL']],
            body: [[data.edad, data.peso, data.talla, data.imc, data.p_abd]],
            theme: 'grid',
            headStyles: { fillColor: [230, 230, 230], textColor: 0, fontStyle: 'bold' },
            styles: { halign: 'center' }
        });
        y = doc.lastAutoTable.finalY + 10;

        // --- SECCIONES ---
        doc.setFont("helvetica", "bold"); doc.text("ANAMNESIS", margen, y); y += 5;
        doc.setFont("helvetica", "normal");
        var splitA = doc.splitTextToSize(data.anamnesis, 180);
        doc.text(splitA, margen, y); y += (splitA.length * 5) + 5;

        doc.setFont("helvetica", "bold"); doc.text("EXAMEN FÍSICO", margen, y); y += 5;
        doc.setFont("helvetica", "normal");
        var splitE = doc.splitTextToSize(data.fisico, 180);
        doc.text(splitE, margen, y); y += (splitE.length * 5) + 5;

        if(data.diag && data.diag.length > 0) {
            doc.setFont("helvetica", "bold"); doc.text("DIAGNÓSTICO", margen, y); y += 5;
            doc.setFont("helvetica", "normal");
            var splitD = doc.splitTextToSize(data.diag, 180);
            doc.text(splitD, margen, y); y += (splitD.length * 5) + 5;
        }

        // --- RECETAS ---
        if (data.recetas && data.recetas.length > 0) {
            // Salto de página si falta espacio para el título de receta
            if (y > 220) { doc.addPage(); y = 20; }
            doc.setFont("helvetica", "bold"); doc.text("RECETA", margen, y); y += 5;
            
            var bodyR = [];
            for(var i=0; i<data.recetas.length; i++){
                bodyR.push([data.recetas[i].med, data.recetas[i].ind]);
            }

            doc.autoTable({
                startY: y,
                head: [['MEDICAMENTO', 'INDICACIÓN']],
                body: bodyR,
                theme: 'striped',
                headStyles: { fillColor: [50, 50, 50] }
            });
            y = doc.lastAutoTable.finalY + 10; // Actualizamos Y al final de la tabla
        }

        // =========================================================
        // FIRMA DIGITAL INTELIGENTE (NO SE MONTA)
        // =========================================================
        
        // Espacio que necesita la firma (aprox 60mm)
        var alturaFirma = 60;
        var pageHeight = doc.internal.pageSize.height;
        
        // Si no hay espacio suficiente en la página actual, creamos una nueva
        if (y + alturaFirma > pageHeight - 10) { 
            doc.addPage();
            y = 20; // Margen superior de la nueva página
        } else {
            y += 10; // Un pequeño margen de separación si cabe en la misma página
        }

        // Dibujamos la firma en la posición Y calculada
        var fechaLocal = new Date().toLocaleString('es-PE');
        var firmaLines = [
            "MEDICO",
            "VIGO AYASTA, Segundo Edilberto",
            "DNI-16586721",
            "CMP-29136",
            "RNE-17563",
            "CALLE AGUA MARINA MANZANA H LOTE 28",
            "URBANIZACIÓN LOS CEDROS DISTRITO TRUJILLO",
            "PROVINCIA TRUJILLO DEPARTAMENTO LA LIBERTAD",
            "TRUJILLO-LA LIBERTAD-TRUJILLO-PE",
            "FIRMADO DIGITALMENTE  " + fechaLocal,
            "CERTIFICADO DIGITAL # PD20*********670",
            "CERTIFICADO VALIDO DEL 06/11/2025  AL 10/11/2027"
        ];

        // Línea sobre la firma
        doc.setDrawColor(0);
        doc.line(margen, y, 100, y);
        y += 5;

        // Texto de la firma
        doc.setFontSize(7);
        for(var j=0; j<firmaLines.length; j++) {
            if(j === 1 || j === 9) doc.setFont("helvetica", "bold");
            else doc.setFont("helvetica", "normal");
            
            doc.text(firmaLines[j], margen, y);
            y += 4;
        }

        doc.save("PD_" + data.hc + "_FIRMADO.pdf");

    } catch (e) {
        console.error(e);
        alert('Error generando PDF: ' + e.message);
    }
}