var tabla;

// Variables globales para datos del paciente actual
var currentPatientData = {
    paciente: '',
    num_documento: '',
    edad: '',
    sexo: '',
    tipo_sangre: ''
};

// --- DYNAMIC FORM LOGIC START ---
function loadClinicalForm(format, callback) {
    if (!format) format = 'MSP_002';

    // Ruta al endpoint que devuelve el HTML del formato
    var url = "../ajax/atencion.php?op=get_form";

    $("#clinical-form-container").html('<div class="text-center"><i class="fa fa-spinner fa-spin fa-3x"></i><br>Cargando formato ' + format + '...</div>');

    var idatencion = $("#idatencion").val();
    $.post(url, { formato: format, idatencion: idatencion }, function (data) {
        $("#clinical-form-container").html(data);

        // ===============================================
        // FETCH FULL PATIENT DATA FOR AUTO-FILL
        // ===============================================
        if (idatencion) {
            $.post("../ajax/atencion.php?op=mostrar", { idatencion: idatencion }, function (r) {
                try {
                    var d = JSON.parse(r);
                    if (d) {
                        currentPatientData = {
                            idpersona: d.idpersona,
                            paciente: d.paciente,
                            nombre_completo: d.paciente, // Alias
                            num_documento: d.num_documento,
                            edad: d.edad,
                            sexo: d.sexo,
                            tipo_sangre: d.tipo_sangre,
                            fecha_nacimiento: d.fecha_nacimiento,
                            telefono: d.telefono,
                            direccion: d.direccion,
                            ocupacion: d.ocupacion,
                            email: d.email,
                            alergia: d.alergia
                        };
                        console.log("✅ Datos del paciente cargados en plan.js:", currentPatientData);

                        // Disparar evento para que los formularios (como Neuropediatria) se actualicen
                        $(document).trigger('patientDataLoaded', [currentPatientData]);

                        // Actualizar headers si existen
                        if ($("#lbl_paciente").length > 0) $("#lbl_paciente").text(d.paciente);
                        if ($("#lbl_documento").length > 0) $("#lbl_documento").text(d.num_documento);
                        if ($("#lbl_edad").length > 0) $("#lbl_edad").text(d.edad);
                        if ($("#lbl_sexo").length > 0) $("#lbl_sexo").text(d.sexo);
                        if ($("#lbl_sangre").length > 0) $("#lbl_sangre").text(d.tipo_sangre);
                    }
                } catch (e) {
                    console.error("Error parsing patient data:", e);
                }
            });
        }

        // SYNC VITAL SIGNS FROM PARENT (Fallback & Immediate Update)
        // Copiar valores de los inputs del padre (header) a los labels del formato cargado
        if ($("#presion_arterial").length > 0) $("#lbl_pa").text($("#presion_arterial").val() || "--/--");
        if ($("#frecuencia_cardiaca").length > 0) $("#lbl_fc").text($("#frecuencia_cardiaca").val() || "--");
        if ($("#frecuencia_respiratoria").length > 0) $("#lbl_fr").text($("#frecuencia_respiratoria").val() || "--");
        if ($("#temperatura").length > 0) $("#lbl_temp").text($("#temperatura").val() || "--");
        if ($("#saturacion").length > 0) $("#lbl_sat").text($("#saturacion").val() || "--");
        if ($("#peso").length > 0) $("#lbl_peso").text($("#peso").val() || "--");
        if ($("#talla").length > 0) $("#lbl_talla").text($("#talla").val() || "--");
        if ($("#imc").length > 0) $("#lbl_imc").text($("#imc").val() || "--");

        // SYNC PATIENT DATA FROM PARENT TO HEADER
        // Poblar datos del paciente en la cabecera del formato MSP
        if ($("#paciente").length > 0 && $("#lbl_paciente").length > 0) {
            $("#lbl_paciente").text($("#paciente").text() || 'No disponible');
        }
        if ($("#dni").length > 0 && $("#lbl_documento").length > 0) {
            $("#lbl_documento").text($("#dni").text() || 'No disponible');
        }
        if ($("#edad").length > 0 && $("#lbl_edad").length > 0) {
            $("#lbl_edad").text($("#edad").text() || 'No disponible');
        }
        if ($("#dni").length > 0 && $("#lbl_hc").length > 0) {
            $("#lbl_hc").text($("#dni").text() || 'No disponible');
        }


        // POBLAR SEXO Y TIPO DE SANGRE desde variables globales
        if ($("#lbl_sexo").length > 0) {
            $("#lbl_sexo").text(currentPatientData.sexo || 'No registrado');
        }
        if ($("#lbl_sangre").length > 0) {
            $("#lbl_sangre").text(currentPatientData.tipo_sangre || 'No registrado');
        }

        // Sync inputs hidden del partial vital_signs
        $("#clinical-form-container").find("#presion_arterial").val($("#presion_arterial").val());
        // (El partial vital_signs tiene inputs con mismo ID que el padre, esto puede causar colisión de selectores.
        //  Es mejor usar selectores relativos o renombrar IDs en el partial. 
        //  Por seguridad, el código de arriba modifica los LBLs visuales que tienen IDs únicos como #lbl_pa).

        // Re-inicializar plugins si es necesario
        $('.selectpicker').selectpicker('refresh');

        // Inicializar autocompletar de medicamentos para el nuevo form
        inicializarAutocompleteMedicamentos();

        // Ejecutar callback si existe (para llenar datos)
        if (callback) callback();
    });
}


$("#format-selector").change(function () {
    var selectedFormat = $(this).val();
    loadClinicalForm(selectedFormat);
});
// --- DYNAMIC FORM LOGIC END ---


// ============================================================
// GESTIÓN DE FORMATOS MÚLTIPLES
// ============================================================

var formatosCompletados = [];
var formatoActualEditando = null;
var filesQueue = []; // Array global para almacenar archivos seleccionados (Movido a Global)

// Agregar nuevo formato
function agregarFormatoNuevo() {
    var formatoSeleccionado = $("#format-selector").val();
    if (!formatoSeleccionado) {
        bootbox.alert("Por favor seleccione un formato");
        return;
    }

    formatoActualEditando = null; // Nuevo formato
    loadClinicalForm(formatoSeleccionado);
}

// Guardar formato actual
function guardarFormatoActual() {
    var idatencion = $("#idatencion").val();
    if (!idatencion) {
        bootbox.alert("No hay una atención activa");
        return;
    }

    var tipoFormato = $("#format-selector").val();
    var formulario = $("#formulariop")[0] || $("#clinical-form-container form")[0];

    if (!formulario) {
        bootbox.alert("No hay formulario para guardar");
        return;
    }

    // Recopilar datos del formulario
    var objetoDatos = {};
    var elementosFormulario = formulario.elements;

    for (var i = 0; i < elementosFormulario.length; i++) {
        var elemento = elementosFormulario[i];
        if (elemento.name && !elemento.disabled) {
            if (elemento.type === 'file') continue;
            if ((elemento.type === 'checkbox' || elemento.type === 'radio') && !elemento.checked) {
                continue;
            }
            objetoDatos[elemento.name] = elemento.value;
        }
    }

    var jsonDatos = JSON.stringify(objetoDatos);

    // Preparar datos para enviar
    var formData = new FormData();
    formData.append('idatencion', idatencion);
    formData.append('tipo_formato', tipoFormato);
    formData.append('datos_json', jsonDatos);

    if (formatoActualEditando) {
        formData.append('id_atencion_formato', formatoActualEditando);
    }

    // --- ENVIO ROBUSTO DE COLA DE ARCHIVOS ---
    if (typeof filesQueue !== 'undefined' && filesQueue.length > 0) {
        var filesFormData = new FormData();
        filesFormData.append('idatencion', idatencion);

        for (var k = 0; k < filesQueue.length; k++) {
            filesFormData.append("archivos_adjuntos[]", filesQueue[k]); // Nota: PHP verá esto como array
        }

        // AJAX SUBIDA ARCHIVOS DEDICADO
        $.ajax({
            url: "../ajax/resultado.php?op=subir_archivos",
            type: "POST",
            data: filesFormData,
            contentType: false,
            processData: false,
            dataType: "json", // Esperamos JSON del nuevo endpoint
            success: function (respFiles) {
                console.log("Respuesta Archivos:", respFiles);
                if (respFiles.status === 'success') {
                    // Limpiar cola solo si éxito
                    filesQueue = [];
                    renderFilesQueue();
                    // bootbox.alert("Archivos adjuntos subidos correctamente: " + respFiles.message); 
                    // No alertar para no interrumpir el flujo principal, solo log o toast
                } else {
                    console.error("Error subida archivos: " + respFiles.message);
                    bootbox.alert("Atención: Hubo un error subiendo los archivos: " + respFiles.message);
                }
            },
            error: function (e) {
                console.error("Error AJAX Archivos:", e);
            }
        });
    }
    // ------------------------------------------

    // Enviar al backend (Datos del formato)
    $.ajax({
        url: "../ajax/atencion_formatos.php?op=guardar",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,
        success: function (respuesta) {
            bootbox.alert(respuesta, function () {
                // Recargar lista de formatos
                listarFormatosCompletados(idatencion);
                // Limpiar formulario
                $("#clinical-form-container").html('<p class="text-muted"><i class="fa fa-info-circle"></i> Seleccione un formato y haga clic en "Agregar Formato"</p>');
                formatoActualEditando = null;
            });
        },
        error: function () {
            bootbox.alert("Error al guardar el formato");
        }
    });
}

// Listar formatos completados
function listarFormatosCompletados(idatencion) {
    $.post("../ajax/atencion_formatos.php?op=listar", { idatencion: idatencion }, function (data) {
        try {
            formatosCompletados = JSON.parse(data);

            if (formatosCompletados.length > 0) {
                $("#formatos-completados-panel").show();
                $("#contador-formatos").text(formatosCompletados.length);

                var html = "";
                formatosCompletados.forEach(function (formato) {
                    var nombreFormato = obtenerNombreFormato(formato.tipo_formato);
                    var fecha = new Date(formato.fecha_modificacion).toLocaleString('es-ES');

                    html += '<tr>';
                    html += '  <td><span class="label label-primary">' + formato.tipo_formato + '</span></td>';
                    html += '  <td>' + nombreFormato + '</td>';
                    html += '  <td><small>' + fecha + '</small></td>';
                    html += '  <td class="text-center">';

                    // Botón Ver PDF (si existe)
                    if (formato.ruta_pdf) {
                        html += '    <button class="btn btn-success btn-xs" onclick="window.open(\'' + formato.ruta_pdf + '\', \'_blank\')" title="Ver PDF">';
                        html += '      <i class="fa fa-file-pdf-o"></i> PDF';
                        html += '    </button> ';
                    }

                    // Botón Editar (En Pestaña)
                    html += '    <button class="btn btn-info btn-xs" onclick="editarFormatoEnPestana(' + formato.id_atencion_formato + ')" title="Editar">';
                    html += '      <i class="fa fa-edit"></i> Editar';
                    html += '    </button> ';

                    // Botón Eliminar
                    html += '    <button class="btn btn-danger btn-xs" onclick="eliminarFormato(' + formato.id_atencion_formato + ', \'' + idatencion + '\')" title="Eliminar">';
                    html += '      <i class="fa fa-trash"></i>';
                    html += '    </button>';
                    html += '  </td>';
                    html += '</tr>';
                });

                $("#tbody-formatos-completados").html(html);

                // Agregar botón de "Reabrir Todos" explícitamente y con evento seguro
                if ($("#btn-reabrir-todos").length === 0) {
                    var btnReabrir = $('<button id="btn-reabrir-todos" class="btn btn-warning btn-sm pull-right" style="margin-right: 5px;"><i class="fa fa-folder-open"></i> Reabrir Todos para Firmar</button>');

                    btnReabrir.click(function () {
                        if (typeof reabrirTodosFormatos === 'function') {
                            reabrirTodosFormatos();
                        } else {
                            // Fallback si no estás cargada la función desde plan_tabs.js
                            bootbox.alert("Función no cargada. Recargando scripts...", function () {
                                location.reload();
                            });
                        }
                    });

                    $("#formatos-completados-panel .box-header").append(btnReabrir);
                }

            } else {
                $("#formatos-completados-panel").hide();
            }
        } catch (e) {
            console.error("Error al parsear formatos:", e);
        }
    });
}
// ... (rest of file)

// Editar formato existente
function editarFormato(id_atencion_formato) {
    $.post("../ajax/atencion_formatos.php?op=obtener", { id_atencion_formato: id_atencion_formato }, function (data) {
        try {
            var formato = JSON.parse(data);
            formatoActualEditando = formato.id_atencion_formato;

            // Cargar el formulario del tipo correspondiente
            $("#format-selector").val(formato.tipo_formato);
            $("#format-selector").selectpicker('refresh');

            loadClinicalForm(formato.tipo_formato, function () {
                // Llenar campos con datos guardados
                var datosClinicos = JSON.parse(formato.datos_json);
                for (var key in datosClinicos) {
                    var campo = document.getElementsByName(key)[0];
                    if (campo && campo.type !== 'file') {
                        $(campo).val(datosClinicos[key]);
                    }
                }

                bootbox.alert("Formato cargado para edición. Modifique los campos y guarde nuevamente.");
            });
        } catch (e) {
            console.error("Error al cargar formato:", e);
            bootbox.alert("Error al cargar el formato para edición");
        }
    });
}

// Eliminar formato
function eliminarFormato(id_atencion_formato, idatencion) {
    bootbox.confirm("¿Está seguro de eliminar este formato?", function (result) {
        if (result) {
            $.post("../ajax/atencion_formatos.php?op=eliminar", { id_atencion_formato: id_atencion_formato }, function (respuesta) {
                bootbox.alert(respuesta, function () {
                    listarFormatosCompletados(idatencion);
                });
            });
        }
    });
}

// Obtener nombre descriptivo del formato
function obtenerNombreFormato(codigo) {
    var nombres = {
        'MSP_001': 'ADMISION Y ALTA-EGRESO 001',
        'HC_MED_FUNCIONAL': 'HISTORIA CLÍNICA DE MEDICINA FUNCIONAL',
        'MSP_002': 'CONSULTA EXTERNA / ANAMNESIS 002',
        'MSP_003': 'ANAMNESIS Y EXAMEN FISICO 003',
        'MSP_005': 'EVOLUCION DIARIA 005',
        'MSP_006': 'EPICRISIS 006',
        'MSP_007': 'INTERCONSULTA 007',
        'MSP_008': 'EMERGENCIA 008',
        'MSP_010': 'LABORATORIO 010',
        'MSP_012': 'IMAGENOLOGIA 012',
        'MSP_013': 'HISTOPATOLOGIA 013',
        'MSP_021': 'SIGNOS VITALES 021',
        'MSP_024': 'CONSENTIMIENTO INFORMADO 024',
        'MSP_033_ODONTO': 'HISTORIA CLINICA ODONTOLOGICA 033',
        'MSP_051': 'HISTORIA CLINICA MATERNA PERINATAL 051',
        'PEDIATRIA': 'PEDIATRIA (CURVAS OMS)',
        'NEUROPEDIATRIA': 'NEUROPEDIATRIA - HISTORIA CLINICA NEUROLOGICA',
        'NEUROPEDIATRIA_PEDIDOS': 'NEUROPEDIATRIA - SOLICITUD DE EXAMENES / PEDIDOS',
        'NEUROPEDIATRIA_EXAMENES': 'NEUROPEDIATRIA - SOLICITUD DE EXAMENES (EEG/POTENCIALES)',
        'ANEXO_1': 'ANEXO 1 - FICHA FAMILIAR',
        'ANEXO_2': 'ANEXO 2 - ATENCION PREHOSPITALARIA',
        'HC_MED_FAMILIAR': 'HC MEDICINA FAMILIAR - HISTORIA CLÍNICA',
        'HISTORIA_ORTODONCIA': 'HISTORIA CLÍNICA - ORTODONCIA',
        'HISTORIA_ENDODONCIA': 'HISTORIA CLÍNICA - ENDODONCIA',
        'DERIVACION_INTERNA': 'DERIVACIÓN / INTERCONSULTA INTERNA'
    };
    return nombres[codigo] || codigo;
}

// ============================================================
// FIN GESTIÓN DE FORMATOS MÚLTIPLES
// ============================================================

function derivarPacienteDirecto() {
    $("#format-selector").val('DERIVACION_INTERNA');
    $("#format-selector").selectpicker('refresh');
    abrirNuevaPestana();
}

function init() {
    mostrarform(false);
    listar();

    // Listener delegado para el form dinámico
    $(document).on("submit", "#formulariop", function (e) {
        guardaryeditar(e);
    });

    // --- GESTIÓN DE COLA DE ARCHIVOS (NUEVO) ---
    // var filesQueue = []; // YA ES GLOBAL

    $("#archivos_adjuntos_input_plan").change(function () {
        var newFiles = $(this)[0].files;

        // Agregar a la cola sin duplicados exactos (nombre+tamaño)
        for (var i = 0; i < newFiles.length; i++) {
            var exists = filesQueue.some(f => f.name === newFiles[i].name && f.size === newFiles[i].size);
            if (!exists) {
                filesQueue.push(newFiles[i]);
            }
        }

        renderFilesQueue();
        $(this).val(""); // Limpiar input para permitir seleccionar el mismo archivo si se borró

        if (filesQueue.length > 0) {
            $(".box-primary.collapsed-box").removeClass("collapsed-box");
        }
    });

    window.renderFilesQueue = function () {
        var html = '<ul class="list-group">';
        filesQueue.forEach(function (file, index) {
            var size = (file.size / 1024).toFixed(1) + ' KB';
            html += '<li class="list-group-item" style="display:flex; justify-content:space-between; align-items:center;">';
            html += '<span><i class="fa fa-file"></i> ' + file.name + ' <small class="text-muted">(' + size + ')</small></span>';
            html += '<button type="button" class="btn btn-xs btn-danger" onclick="removeFileFromQueue(' + index + ')"><i class="fa fa-times"></i></button>';
            html += '</li>';
        });
        html += '</ul>';
        $("#lista_archivos_preview_plan").html(html);
    }

    window.removeFileFromQueue = function (index) {
        filesQueue.splice(index, 1);
        renderFilesQueue();
    }
    // --------------------------------------------

    // Inicializar autocomplete para medicamentos (se llama también al cargar form dinámico)
    inicializarAutocompleteMedicamentos();
}

function mostrar(idatencion) {
    $.post("../ajax/resultado.php?op=mostrar", { idatencion: idatencion }, function (data, status) {
        data = JSON.parse(data);
        mostrarform(true);

        // --- DYNAMIC LOADING START ---
        var formato = data.tipo_formato || 'MSP_002'; // Fallback

        // GUARDAR DATOS DEL PACIENTE EN VARIABLES GLOBALES
        currentPatientData = {
            paciente: data.paciente || '',
            num_documento: data.num_documento || '',
            edad: data.edad || '',
            sexo: data.sexo || '',
            tipo_sangre: data.tipo_sangre || '',
            responsable: data.persona_responsable || '',
            especialista: data.especialista || '',
            fecha_nacimiento: data.fecha_nacimiento || '',
            idpersona: data.idpersona || ''
        };

        // --- FIX CRÍTICO: Asignar ID inmediatamente ---
        $("#idatencion").val(data.idatencion);
        $("#idpersona").val(data.idpersona);

        // Asignar datos básicos visuales de inmediato
        $("#edad").html(data.edad);
        $("#dni").html(data.num_documento);
        $("#paciente").html(data.paciente);
        $("#especialista").html(data.especialista);
        $("#servicio").html(data.servicio);

        // DISPARAR EVENTO PERSONALIZADO
        $(document).trigger('patientDataLoaded', [currentPatientData]);

        // Header Global
        $("#lbl_paciente_global").text(data.paciente || 'Paciente no identificado');

        // DEBUG: Ver qué datos llegan del backend
        console.log("=== DATOS DEL BACKEND ===");
        console.log("Paciente:", data.paciente);
        console.log("ID Atención:", data.idatencion);
        console.log("Data completa:", data);

        // Actualizar selector
        if ($("#format-selector").length > 0) {
            $("#format-selector").val(formato);
            $("#format-selector").selectpicker('refresh');
        }

        loadClinicalForm(formato, function () {
            // Callback: Llenar datos DESPUES de cargar el HTML

            // POBLAR CABECERA DEL FORMATO MSP (patient_header.php)
            if ($("#lbl_paciente").length) $("#lbl_paciente").text(data.paciente || 'No disponible');
            if ($("#lbl_documento").length) $("#lbl_documento").text(data.num_documento || 'No disponible');
            if ($("#lbl_edad").length) $("#lbl_edad").text(data.edad || 'No disponible');
            if ($("#lbl_hc").length) $("#lbl_hc").text(data.num_documento || 'No disponible');
            if ($("#lbl_sexo").length) $("#lbl_sexo").text(data.sexo || 'No registrado');
            if ($("#lbl_sangre").length) $("#lbl_sangre").text(data.tipo_sangre || 'No registrado');

            // DEBUG: Verificar si los elementos existen
            console.log("Elemento #lbl_sexo existe:", $("#lbl_sexo").length);
            console.log("Elemento #lbl_sangre existe:", $("#lbl_sangre").length);

            // CARGAR FORMATOS COMPLETADOS
            listarFormatosCompletados(idatencion);


            // Llenar campos comunes y específicos dinámicamente
            // Mapeo manual de campos vitales (siempre presentes en header o form)
            $("#presion_arterial").val(data.presion_arterial);
            $("#temperatura").val(data.temperatura);
            $("#frecuencia_respiratoria").val(data.frecuencia_respiratoria);
            $("#frecuencia_cardiaca").val(data.frecuencia_cardiaca);
            $("#saturacion").val(data.saturacion);
            $("#peso").val(data.peso);
            $("#talla").val(data.talla);
            var imc2 = Number(data.imc);
            $("#imc").val(imc2.toFixed(2));

            $("#idpersona").val(data.idpersona);

            // Para datos guardados en JSON (campos dinámicos)
            if (data.datos_clinicos && data.datos_clinicos !== "") {
                try {
                    var datosClinicos = (typeof data.datos_clinicos === 'string') ? JSON.parse(data.datos_clinicos) : data.datos_clinicos;
                    for (var key in datosClinicos) {
                        var campo = document.getElementsByName(key)[0];
                        if (campo) {
                            if (campo.type !== 'file') $(campo).val(datosClinicos[key]);
                        }
                    }
                } catch (e) { console.error(e); }
            } else {
                // Compatibilidad hacia atrás (campos planos en DB)
                $("#motivo_consulta").val(data.motivo_consulta);
                $("#tiempo_enfermedad").val(data.tiempo_enfermedad);
                $("#antecedentes").val(data.antecedentes);
                $("#examen_fisico").val(data.examen_fisico);
                $("#tratamiento").val(data.tratamiento);
                $("#proxima_cita").val(data.proxima_cita);
                $("#plan").val(data.plan);
                $("#alergia").val(data.alergia);
                $("#intervenciones_quirurgicas").val(data.intervenciones_quirurgicas);
                $("#vacunas_completas").val(data.vacunas_completas);
            }

            // Recetas y Detalles
            $.post("../ajax/resultado.php?op=detalles&idresultado=" + data.idresultado, function (r) {
                $("#tablabody").html(r);
                $("#btnGuardar").show(); // Ensure button is shown logic
            });

            $.post("../ajax/resultado.php?op=recetas&idatencion=" + idatencion, function (r) {
                $("#tablabodyrecetas").html(r);
            });

        });

        // --- DYNAMIC LOADING END ---
    })
}

// ... existing code ...
function guardaryeditar(e) {
    e.preventDefault(); //No se activará la acción predeterminada del evento
    // idatencion = $("#idatencion").val(); // Ojo: en formularios dinámicos el ID puede estar en otro input o hidden class
    // Lo mejor es obtenerlo del formData o buscarlo explícitamente dentro del form submitteado

    var form = $(e.target);
    var formData = new FormData(form[0]);

    // Obtener idatencion del form (asegurar que exista input con name="idatencion" o "idatencionp")
    // En msp_002 es "idatencionp". En plan.php original era "idatencion".
    // El backend espera "idatencion". Si el form envía "idatencionp", mi fix en backend lo maneja.
    // Para el window.open, necesitamos el ID.
    idatencion = formData.get("idatencion") || formData.get("idatencionp") || $("#idatencion").val();

    // Agregar manualmente el formato selected
    var tipoFormato = $("#format-selector").val();
    if (tipoFormato && !formData.has('tipo_formato')) {
        formData.append('tipo_formato', tipoFormato);
    }

    // Serializar campos dinámicos a JSON 'datos_clinicos'
    var objetoDatos = {};
    var elementosFormulario = form[0].elements;

    for (var i = 0; i < elementosFormulario.length; i++) {
        var elemento = elementosFormulario[i];
        if (elemento.name && !elemento.disabled) {
            if (elemento.type === 'file') continue;
            if ((elemento.type === 'checkbox' || elemento.type === 'radio') && !elemento.checked) {
                continue;
            }
            // Excluir campos estáticos si se desea, pero mejor incluir todo para flexibilidad
            objetoDatos[elemento.name] = elemento.value;
        }
    }
    var jsonDatos = JSON.stringify(objetoDatos);
    formData.append('datos_clinicos', jsonDatos);


    $("#btnGuardarP").prop("disabled", true); // Boton en formularios dynamicos suele ser btnGuardarP
    $("#btnGuardar").prop("disabled", true);

    $.ajax({
        url: "../ajax/resultado.php?op=guardaryeditar",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,

        success: function (datos) {
            bootbox.alert(datos, function () { // Mostrar mensaje del backend
                mostrarform(false);
                tabla.ajax.reload();
                if (idatencion) {
                    // COMENTADO PARA EVITAR ABRIR FORMATO ANTIGUO
                    // window.open("../reportes/historia.php?idatencion=" + idatencion, '_blank');
                    // window.open("../reportes/receta.php?idatencion=" + idatencion, '_blank');
                    console.log("Guardado exitoso. Los formatos específicos se manejan individualmente.");
                }
            });
        }
    });
    limpiar();
}
// ... existing code ...

//Función limpiar
function limpiar() {
    // $("#idatencion").val(""); // NO borrar ID de atención para persistencia
    $("#tiempo_enfermedad").val("");
    $("#tiempo_enfermedad").val("");
    $("#antecedentes").val("");
    $("#examen_fisico").val("");
    $("#tratamiento").val("");
    $("#receta").val("");
    $("#proxima_cita").val("");
    $("#motivo_consulta").val("");
    $("#plan").val("");
    $("#texto").val("");
    $("#diagnosticos").html("");
    //$("#estado").val("");
    $(".filas").remove();
    $(".filasr").remove();
    cont = 0;
    contr = 1;
    detalles = 0;
    $("#btnGuardar").hide();
}

//Función mostrar formulario
function mostrarform(flag) {
    limpiar();
    if (flag) {
        $("#listadoregistros").hide();
        $("#formularioregistros").show();
        $("#btnGuardar").prop("disabled", false);
        $("#btnagregar").hide();

    } else {
        $("#listadoregistros").show();
        $("#formularioregistros").hide();
        $("#btnagregar").show();
    }
}

//Función cancelarform
function cancelarform() {
    limpiar();
    mostrarform(false);
}

//Función Listar
function listar() {
    tabla = $('#tbllistado').dataTable(
        {
            "aProcessing": true,//Activamos el procesamiento del datatables
            "aServerSide": true,//Paginación y filtrado realizados por el servidor
            dom: 'Bfrtip',//Definimos los elementos del control de tabla
            buttons: [
                'copyHtml5',
                'excelHtml5',
                'csvHtml5',
                'pdf'
            ],
            "ajax":
            {
                url: '../ajax/resultado.php?op=listar',
                type: "get",
                dataType: "json",
                error: function (e) {
                    console.log(e.responseText);
                }
            },
            "bDestroy": true,
            "iDisplayLength": 5
        }).DataTable();
}

//Función para guardar o editar
function guardaryeditar(e) {
    idatencion = $("#idatencion").val();
    e.preventDefault(); //No se activará la acción predeterminada del evento
    $("#btnGuardar").prop("disabled", true);
    var formData = new FormData($("#formulario")[0]);

    $.ajax({
        url: "../ajax/resultado.php?op=guardaryeditar",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,

        success: function (datos) {
            bootbox.alert("Atención guardada correctamente.", function () {
                mostrarform(false);
                tabla.ajax.reload();
                // Abrir pestañas tradicionales directamente
                // window.open("../reportes/historia.php?idatencion=" + idatencion, '_blank');
                // window.open("../reportes/receta.php?idatencion=" + idatencion, '_blank');
                console.log("Guardado Exitado Legacy desactivado.");
            });
        }
    });
    limpiar();
}

// Función para mostrar opción de firma digital
function mostrarOpcionFirma(idatencion) {
    bootbox.confirm({
        message: "<h4><i class='fa fa-pencil-square-o'></i> Firma Electrónica</h4><p>¿Desea firmar digitalmente esta receta ahora?</p>",
        buttons: {
            confirm: {
                label: 'Sí, Firmar Ahora',
                className: 'btn-success'
            },
            cancel: {
                label: 'No, Después',
                className: 'btn-default'
            }
        },
        callback: function (result) {
            if (result) {
                solicitarPasswordFirma(idatencion);
            }
        }
    });
}

// Función para firmar receta electrónicamente
function firmarReceta(idatencion) {
    bootbox.dialog({
        message: '<div class="text-center"><i class="fa fa-spin fa-spinner"></i> Firmando receta electrónicamente...</div>',
        closeButton: false
    });

    $.ajax({
        url: "../ajax/firmar_receta.php?op=firmar",
        type: "POST",
        data: {
            idatencion: idatencion,
            idempleado: (typeof idempleado_session !== 'undefined') ? idempleado_session : 0
        },
        dataType: "json",
        success: function (response) {
            bootbox.hideAll();
            if (response.success) {
                bootbox.alert({
                    message: '<div class="alert alert-success">' +
                        '<h4><i class="fa fa-check"></i> Receta Firmada Exitosamente</h4>' +
                        '<p>' + response.message + '</p>' +
                        '<p><small>Hash: ' + response.hash.substring(0, 20) + '...</small></p>' +
                        '</div>',
                    callback: function () {
                        // Abrir PDF firmado
                        window.open('../ajax/firmar_receta.php?op=descargar&idatencion=' + idatencion, '_blank');
                    }
                });
            } else {
                bootbox.alert({
                    message: '<div class="alert alert-danger">' +
                        '<h4><i class="fa fa-exclamation-triangle"></i> Error</h4>' +
                        '<p>' + response.message + '</p>' +
                        '</div>'
                });
            }
        },
        error: function (xhr, status, error) {
            bootbox.hideAll();
            bootbox.alert({
                message: '<div class="alert alert-danger">' +
                    '<h4><i class="fa fa-exclamation-triangle"></i> Error de Conexión</h4>' +
                    '<p>No se pudo conectar con el servidor de firma digital.</p>' +
                    '<p><small>' + error + '</small></p>' +
                    '</div>'
            });
        }
    });
}

// Función para verificar firma de receta
function verificarFirma(idatencion) {
    bootbox.dialog({
        message: '<div class="text-center"><i class="fa fa-spin fa-spinner"></i> Verificando firma...</div>',
        closeButton: false
    });

    $.ajax({
        url: "../ajax/firmar_receta.php?op=verificar&idatencion=" + idatencion,
        type: "GET",
        dataType: "json",
        success: function (response) {
            bootbox.hideAll();
            if (response.success && response.firmado) {
                var mensaje = '<div class="alert alert-success">' +
                    '<h4><i class="fa fa-check-circle"></i> Firma Válida</h4>' +
                    '<p><b>Fecha de firma:</b> ' + response.fecha_firma + '</p>' +
                    '<p><b>Integridad:</b> ' + (response.integro ? 'Verificada ✓' : 'Comprometida ✗') + '</p>' +
                    '</div>';
                bootbox.alert(mensaje);
            } else {
                bootbox.alert({
                    message: '<div class="alert alert-warning">' +
                        '<h4><i class="fa fa-info-circle"></i> Sin Firma</h4>' +
                        '<p>' + response.message + '</p>' +
                        '</div>'
                });
            }
        },
        error: function () {
            bootbox.hideAll();
            bootbox.alert('Error al verificar la firma');
        }
    });
}


// FUNCIÓN mostrar() ELIMINADA - Ya existe una versión actualizada en la línea 82

function buscarDiagnostico() {

    var texto = $("#texto").val();
    $.post("../ajax/resultado.php?op=diagnosticos&texto=" + texto, function (r) {
        $("#diagnosticos").html(r);
    });
}

//Declaración de variables necesarias para trabajar con las compras y
//sus detalles
var impuesto = 18;
var cont = 0;
var contr = 1;
var detalles = 0;
$("#btnGuardar").hide();


function agregar(iddiagnostico, enfermedad) {
    if (iddiagnostico != "") {
        var fila = '<tr class="filas" id="fila' + cont + '">' +
            '<td><button type="button" class="btn btn-danger" onclick="eliminarDetalle(' + cont + ')"><i class="fa fa-trash"></i></button></td>' +
            '<td><select name="tipo[]"><option value="P">P</option><option value="D">D</option><option value="R">R</option></select></td>' +
            '<td><input type="hidden" name="iddiagnostico[]" value="' + iddiagnostico + '">' + enfermedad + '</td>' +
            '</tr>';
        cont++;
        detalles = detalles + 1;
        $('#detalles').append(fila);
    } else {
        alert("Error al aplicar el diagnóstico, revise los datos.");
    }
    evaluar();
}

function agregarReceta() {
    var optionsVia = '<option value="ORAL">ORAL</option>' +
        '<option value="SUBLINGUAL">SUBLINGUAL</option>' +
        '<option value="BUCAL">BUCAL</option>' +
        '<option value="RECTAL">RECTAL</option>' +
        '<option value="INTRAVENOSA">INTRAVENOSA</option>' +
        '<option value="INTRAMUSCULAR">INTRAMUSCULAR</option>' +
        '<option value="SUBCUTANEA">SUBCUTANEA</option>' +
        '<option value="INTRARECTAL">INTRARECTAL</option>' +
        '<option value="INTRADERMICA">INTRADERMICA</option>' +
        '<option value="TOPICA">TOPICA</option>' +
        '<option value="TOPICADERMICA">TOPICADERMICA</option>' +
        '<option value="TRANSDERMICA">TRANSDERMICA</option>' +
        '<option value="OFTALMICA">OFTALMICA</option>' +
        '<option value="OTICA">OTICA</option>' +
        '<option value="NASAL">NASAL</option>' +
        '<option value="VAGINAL">VAGINAL</option>' +
        '<option value="INHALATORIA">INHALATORIA</option>' +
        '<option value="RESPIRATORIA">RESPIRATORIA</option>';

    var fila = '<tr class="filasr" id="filar' + contr + '">' +
        '<td><button type="button" class="btn btn-sm btn-danger" onclick="eliminarReceta(' + contr + ')"><i class="fa fa-trash"></i></button></td>' +
        '<td><input type="text" class="form-control medicamento-input" id="medicamento_' + contr + '" name="medicamento[]" autocomplete="off" data-row="' + contr + '" required=""><input type="hidden" id="medicamento_id_' + contr + '" name="medicamento_id[]"></td>' +
        '<td><input type="text" class="form-control" name="concentracion[]" placeholder="Ej: 500MLG"></td>' +
        '<td><input type="text" class="form-control" id="presentacion_' + contr + '" name="presentacion[]"></td>' +
        '<td><select class="form-control" name="via_administracion[]">' + optionsVia + '</select></td>' +
        '<td><input type="text" class="form-control" name="cantidad[]" placeholder="NUMEROS Y LETRAS"></td>' +
        '<td><input type="text" class="form-control" name="posologia[]"></td>' +
        '</tr>';
    contr++;
    $('#recetas').append(fila);
    // Inicializar autocomplete para la nueva fila
    inicializarAutocompleteMedicamentos();
}

function evaluar() {
    if (detalles > 0) {
        $("#btnGuardar").show();
    } else {
        $("#btnGuardar").hide();
        cont = 0;
    }
}

function eliminarDetalle(indice) {
    $("#fila" + indice).remove();
    detalles = detalles - 1;
    evaluar();
}

function eliminarReceta(indice) {
    $("#filar" + indice).remove();
}

// Función para inicializar el autocompletado de medicamentos
function inicializarAutocompleteMedicamentos() {
    $('.medicamento-input').each(function () {
        var $input = $(this);

        // Evitar inicializar múltiples veces el mismo input
        if ($input.data('autocomplete-initialized')) {
            return;
        }

        var rowNumber = $input.data('row');

        $input.autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: "../ajax/medicamentos.php?op=buscar_medicamentos",
                    dataType: "json",
                    data: {
                        texto: request.term
                    },
                    success: function (data) {
                        response(data);
                    },
                    error: function (xhr, status, error) {
                        console.log("Error en autocomplete:", error);
                        response([]);
                    }
                });
            },
            minLength: 2,
            select: function (event, ui) {
                // Poblar el campo de medicamento con la denominación
                $(this).val(ui.item.denominacion);

                // Guardar el ID del medicamento en el campo oculto
                $('#medicamento_id_' + rowNumber).val(ui.item.id);

                // Poblar automáticamente el campo de presentación con la forma farmacéutica
                $('#presentacion_' + rowNumber).val(ui.item.forma_farmaceutica);

                return false;
            },
            focus: function (event, ui) {
                $(this).val(ui.item.denominacion);
                return false;
            }
        }).data('autocomplete-initialized', true);
    });
}

// ==========================================
// MÓDULO DE VACUNAS Y GRÁFICOS
// ==========================================

// ==========================================
// MÓDULO DE VACUNAS (INTEGRADO EN PEDIATRÍA)
// ==========================================

// Función llamada desde pediatria.php
function cargarEsquemaVacunasPediatria(idpersona, fecha_nacimiento) {
    if (!idpersona) return;

    var container = $("#vaccine-timeline-pediatria");
    container.html('<div style="text-align: center; color: #7f8c8d;"><i class="fa fa-spinner fa-spin"></i> Cargando Esquema...</div>');
    $("#lbl-estado-vacunal-pediatria").text("...");

    $.ajax({
        url: "../ajax/vacuna.php?op=listar_esquema",
        type: "GET",
        dataType: "json",
        success: function (esquema) {
            $.ajax({
                url: "../ajax/vacuna.php?op=listar_vacunas_paciente",
                type: "POST",
                data: { idpersona: idpersona },
                dataType: "json",
                success: function (vacunasAplicadas) {
                    if (!vacunasAplicadas) vacunasAplicadas = [];
                    renderizarTimelinePediatria(esquema, vacunasAplicadas, fecha_nacimiento);
                }
            });
        }
    });
}

function renderizarTimelinePediatria(esquema, vacunasAplicadas, fecha_nacimiento) {
    var timeline = '';
    var vacunasMap = {};
    vacunasAplicadas.forEach(function (v) { vacunasMap[v.idesquema] = v; });

    // Calcular estado
    var total = esquema.filter(function (v) { return v.obligatoria == 1 }).length;
    var aplicadas = vacunasAplicadas.filter(function (v) { return v.estado == 'aplicada' }).length;
    var p = (total === 0) ? 0 : Math.round((aplicadas / total) * 100);
    $("#lbl-estado-vacunal-pediatria").text(p + "%");
    $("#lbl-estado-vacunal-pediatria").css("background-color", (p >= 80) ? '#00a65a' : (p >= 50 ? '#f39c12' : '#dd4b39'));

    esquema.forEach(function (item) {
        var aplicada = vacunasMap[item.idesquema];
        var estado = aplicada ? aplicada.estado : 'pendiente';
        var colorClass = '';
        var iconoEstado = '';

        if (estado === 'aplicada') {
            colorClass = 'background: #eafaf1; border-color: #2ecc71; color: #27ae60;';
            iconoEstado = '<i class="fa fa-check-circle"></i>';
        } else if (estado === 'vencida') {
            colorClass = 'background: #fdedec; border-color: #e74c3c; color: #c0392b;';
            iconoEstado = '<i class="fa fa-exclamation-circle"></i>';
        } else {
            colorClass = 'background: #f4f6f7; border-color: #bdc3c7; color: #7f8c8d;';
            iconoEstado = '<i class="fa fa-clock-o"></i>';
        }

        timeline += '<div style="display: inline-block; min-width: 120px; padding: 8px; margin: 0 5px; border: 1px solid; border-radius: 8px; ' + colorClass + ' text-align: center; font-size: 11px;">';
        timeline += '<div style="font-weight: bold; margin-bottom: 2px;">' + item.nombre_vacuna + '</div>';
        timeline += '<div style="font-size: 10px; margin-bottom: 2px;">' + item.edad_etiqueta + '</div>';
        timeline += '<div style="font-size: 14px;">' + iconoEstado + '</div>';
        if (aplicada && aplicada.fecha_aplicacion) {
            timeline += '<div style="margin-top: 2px;">' + aplicada.fecha_aplicacion + '</div>';
        }
        timeline += '</div>';
    });
    $("#vaccine-timeline-pediatria").html(timeline);
}


init();
