// ============================================================
// SISTEMA DE PESTAÑAS PARA FORMATOS MÚLTIPLES
// Archivo: plan_tabs.js
// Descripción: Gestiona pestañas para llenar múltiples formatos MSP
// ============================================================

var pestanasAbiertas = []; // Array de objetos {id, tipo_formato, nombre, datos}
var pestanaActiva = null;
var contadorPestanas = 0;

// Abrir nueva pestaña
function abrirNuevaPestana() {
    // Validar que exista una atención activa
    var idatencion = $("#idatencion").val();
    if (!idatencion || idatencion === "") {
        bootbox.alert({
            title: "⚠️ Atención Requerida",
            message: "No hay una atención médica activa seleccionada.\n\n" +
                "Por favor:\n" +
                "1. Seleccione un paciente de la tabla de atenciones\n" +
                "2. Luego podrá agregar formatos"
        });
        return;
    }

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

    // Verificar si ya existe una pestaña con este formato sin guardar
    var existente = pestanasAbiertas.find(p => p.tipo_formato === formatoSeleccionado && !p.id_atencion_formato);
    if (existente) {
        activarPestana(existente.id);
        bootbox.alert("Ya tiene una pestaña abierta con este formato. Guárdela primero si desea abrir otra.");
        return;
    }

    contadorPestanas++;
    var idPestana = 'tab-' + contadorPestanas;
    var nombreFormato = obtenerNombreFormato(formatoSeleccionado);

    // Crear objeto de pestaña
    var nuevaPestana = {
        id: idPestana,
        tipo_formato: formatoSeleccionado,
        nombre: nombreFormato,
        datos: {},
        id_atencion_formato: null // null = nuevo, número = editando
    };

    pestanasAbiertas.push(nuevaPestana);

    // Crear pestaña en UI
    crearPestanaUI(nuevaPestana);

    // Cargar formulario
    cargarFormularioEnPestana(nuevaPestana);

    // Mostrar contenedor de pestañas
    $("#tabs-formatos-container").show();
}

// Crear pestaña en la interfaz
function crearPestanaUI(pestana) {
    // Crear tab header
    var tabHeader = $('<li role="presentation"></li>');
    tabHeader.attr('id', 'li-' + pestana.id);

    var tabLink = $('<a href="#' + pestana.id + '" data-toggle="tab"></a>');
    tabLink.html(
        '<i class="fa fa-file-text-o"></i> ' + pestana.tipo_formato +
        ' <button class="close-tab" onclick="cerrarPestana(\'' + pestana.id + '\'); return false;" title="Cerrar" style="margin-left: 10px; background: none; border: none; color: #dd4b39; font-weight: bold;">' +
        '<i class="fa fa-times-circle"></i></button>'
    );

    tabHeader.append(tabLink);
    $("#tabs-formatos").append(tabHeader);

    // Crear tab content
    var tabContent = $('<div role="tabpanel" class="tab-pane" id="' + pestana.id + '"></div>');
    tabContent.html('<div class="text-center" style="padding: 50px;"><i class="fa fa-spinner fa-spin fa-3x text-primary"></i><br><br><h4>Cargando formato...</h4></div>');
    $("#tabs-content-formatos").append(tabContent);

    // Activar pestaña
    tabLink.tab('show');
    pestanaActiva = pestana.id;
}

// Cargar formulario en pestaña
function cargarFormularioEnPestana(pestana) {
    var url = "../ajax/atencion.php?op=get_form";
    var idatencion = $("#idatencion").val();

    $.post(url, { formato: pestana.tipo_formato, idatencion: idatencion }, function (data) {
        var tabContent = $("#" + pestana.id);

        // Crear contenedor (Sin botones individuales)
        var html = '<div class="formato-wrapper">';
        html += data; // Contenido del formulario
        html += '</div>';

        tabContent.html(html);

        // Poblar datos del paciente
        setTimeout(function () {
            poblarDatosPacienteEnPestana(tabContent);
            // Sincronizar diagnósticos globales si existen
            if (typeof sincronizarDiagnosticosEnUI === 'function' && currentDiagnosticosCIE10.length > 0) {
                sincronizarDiagnosticosEnUI();
            }
        }, 100);

        // Si es edición, llenar datos
        if (pestana.datos && Object.keys(pestana.datos).length > 0) {
            llenarDatosEnFormulario(tabContent, pestana.datos);
        }

        // Inicializar plugins
        tabContent.find('.selectpicker').selectpicker('refresh');
    });
}

// Poblar datos del paciente en pestaña activa
function poblarDatosPacienteEnPestana() {
    // Obtener la pestaña activa
    var tabActivo = $(".tab-pane.active");

    if (tabActivo.length === 0) {
        // Si no hay pestaña activa, buscar en toda la página
        tabActivo = $(document);
    }

    // DATOS DEL PACIENTE
    if (tabActivo.find("#lbl_paciente").length) {
        tabActivo.find("#lbl_paciente").text(currentPatientData.paciente || 'No disponible');
    }
    if (tabActivo.find("#lbl_documento").length) {
        tabActivo.find("#lbl_documento").text(currentPatientData.num_documento || 'No disponible');
    }
    if (tabActivo.find("#lbl_edad").length) {
        tabActivo.find("#lbl_edad").text(currentPatientData.edad || 'No disponible');
    }
    if (tabActivo.find("#lbl_hc").length) {
        tabActivo.find("#lbl_hc").text(currentPatientData.num_documento || 'No disponible');
    }
    if (tabActivo.find("#lbl_sexo").length) {
        tabActivo.find("#lbl_sexo").text(currentPatientData.sexo || 'No registrado');
    }
    if (tabActivo.find("#lbl_sangre").length) {
        tabActivo.find("#lbl_sangre").text(currentPatientData.tipo_sangre || 'No registrado');
    }

    // SIGNOS VITALES (desde inputs hidden en plan.php)
    var presion = $("#presion_arterial").val();
    var temp = $("#temperatura").val();
    var fc = $("#frecuencia_cardiaca").val();
    var fr = $("#frecuencia_respiratoria").val();
    var sat = $("#saturacion").val();
    var peso = $("#peso").val();
    var talla = $("#talla").val();
    var imc = $("#imc").val();

    // CAMPOS DE DATOS EXTRA EN FORMATOS
    // Poblar Profesional de Salud si existe el campo
    if (tabActivo.find("#nombre_profesional").length) {
        tabActivo.find("#nombre_profesional").val(currentPatientData.especialista || '');
    }

    // Poblar Firmante inicial si está vacío
    if (tabActivo.find("#nombre_firmante").length && tabActivo.find("#nombre_firmante").val() === "") {
        tabActivo.find("#nombre_firmante").val(currentPatientData.paciente || '');
    }

    if (tabActivo.find("#lbl_pa").length) tabActivo.find("#lbl_pa").text(presion || '--/--');
    if (tabActivo.find("#lbl_temp").length) tabActivo.find("#lbl_temp").text(temp || '--');
    if (tabActivo.find("#lbl_fc").length) tabActivo.find("#lbl_fc").text(fc || '--');
    if (tabActivo.find("#lbl_fr").length) tabActivo.find("#lbl_fr").text(fr || '--');
    if (tabActivo.find("#lbl_sat").length) tabActivo.find("#lbl_sat").text(sat || '--');
    if (tabActivo.find("#lbl_peso").length) tabActivo.find("#lbl_peso").text(peso || '--');
    if (tabActivo.find("#lbl_talla").length) tabActivo.find("#lbl_talla").text(talla || '--');
    if (tabActivo.find("#lbl_imc").length) tabActivo.find("#lbl_imc").text(imc || '--');

    // --- FIX: Poblar INPUTS también (para Pediatría y otros formatos editables) ---
    if (tabActivo.find("input[name='presion_arterial']").length && presion) tabActivo.find("input[name='presion_arterial']").val(presion);
    if (tabActivo.find("input[name='temperatura']").length && temp) tabActivo.find("input[name='temperatura']").val(temp);
    if (tabActivo.find("input[name='frecuencia_cardiaca']").length && fc) tabActivo.find("input[name='frecuencia_cardiaca']").val(fc);
    if (tabActivo.find("input[name='frecuencia_respiratoria']").length && fr) tabActivo.find("input[name='frecuencia_respiratoria']").val(fr);
    if (tabActivo.find("input[name='saturacion']").length && sat) tabActivo.find("input[name='saturacion']").val(sat);

    // Para peso y talla, disparar 'change' para que se recalculen gráficos/IMC si es necesario
    if (tabActivo.find("input[name='peso']").length && peso) {
        tabActivo.find("input[name='peso']").val(peso).trigger('change');
    }
    if (tabActivo.find("input[name='talla']").length && talla) {
        tabActivo.find("input[name='talla']").val(talla).trigger('change');
    }
    if (tabActivo.find("input[name='imc']").length && imc) tabActivo.find("input[name='imc']").val(imc);

    console.log("Datos poblados en pestaña:", {
        paciente: currentPatientData.paciente,
        sexo: currentPatientData.sexo,
        tipo_sangre: currentPatientData.tipo_sangre,
        presion: presion,
        temperatura: temp
    });
}

// Guardar pestaña actual
function guardarPestana(idPestana) {
    var pestana = pestanasAbiertas.find(p => p.id === idPestana);
    if (!pestana) return;

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

    // Obtener formulario de la pestaña
    var tabContent = $("#" + idPestana);
    var formulario = tabContent.find("form")[0];

    if (!formulario) {
        bootbox.alert("No se encontró el formulario");
        return;
    }

    // Recopilar datos
    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', pestana.tipo_formato);
    formData.append('datos_json', jsonDatos);

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

    // Enviar al backend
    $.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 guardados
                listarFormatosCompletados(idatencion);
                // Cerrar pestaña sin confirmar
                cerrarPestanaSinConfirmar(idPestana);
            });
        },
        error: function () {
            bootbox.alert("Error al guardar el formato");
        }
    });
}

// Cerrar pestaña
function cerrarPestana(idPestana) {
    bootbox.confirm("¿Desea cerrar esta pestaña? Los cambios no guardados se perderán.", function (result) {
        if (result) {
            cerrarPestanaSinConfirmar(idPestana);
        }
    });
}

// Cerrar pestaña sin confirmación
function cerrarPestanaSinConfirmar(idPestana) {
    // Eliminar de array
    pestanasAbiertas = pestanasAbiertas.filter(p => p.id !== idPestana);

    // Eliminar de UI
    $("#li-" + idPestana).remove();
    $("#" + idPestana).remove();

    // Si no quedan pestañas, ocultar contenedor
    if (pestanasAbiertas.length === 0) {
        $("#tabs-formatos-container").hide();
        pestanaActiva = null;
    } else {
        // Activar primera pestaña
        $("#tabs-formatos li:first a").tab('show');
        pestanaActiva = pestanasAbiertas[0].id;
    }
}

// Activar pestaña
function activarPestana(idPestana) {
    $("#li-" + idPestana + " a").tab('show');
    pestanaActiva = idPestana;
}

// Llenar datos en formulario
function llenarDatosEnFormulario(contenedor, datos) {
    for (var key in datos) {
        var campo = contenedor.find('[name="' + key + '"]')[0];
        if (campo && campo.type !== 'file') {
            $(campo).val(datos[key]);
        }
    }
}

// Editar formato guardado (abrir en nueva pestaña)
function editarFormatoEnPestana(id_atencion_formato) {
    $.post("../ajax/atencion_formatos.php?op=obtener", { id_atencion_formato: id_atencion_formato }, function (data) {
        try {
            var formato = JSON.parse(data);

            contadorPestanas++;
            var idPestana = 'tab-' + contadorPestanas;
            var nombreFormato = obtenerNombreFormato(formato.tipo_formato);

            // Crear objeto de pestaña
            var nuevaPestana = {
                id: idPestana,
                tipo_formato: formato.tipo_formato,
                nombre: nombreFormato,
                datos: JSON.parse(formato.datos_json),
                id_atencion_formato: formato.id_atencion_formato
            };

            pestanasAbiertas.push(nuevaPestana);

            // Crear pestaña en UI
            crearPestanaUI(nuevaPestana);

            // Cargar formulario
            cargarFormularioEnPestana(nuevaPestana);

            // Mostrar contenedor de pestañas
            $("#tabs-formatos-container").show();

        } catch (e) {
            console.error("Error al cargar formato:", e);
            bootbox.alert("Error al cargar el formato para edición");
        }
    });
}

// ===================================
// FUNCIÓN GLOBAL DE GUARDADO Y FINALIZACIÓN
// ===================================
function guardarTodoYFinalizar() {
    var idatencion = $("#idatencion").val();
    if (!idatencion || idatencion === "") {
        bootbox.alert({
            title: "⚠️ Atención Requerida",
            message: "No hay una atención médica activa seleccionada.\n\n" +
                "Por favor:\n" +
                "1. Seleccione un paciente de la tabla de atenciones\n" +
                "2. Luego podrá agregar y guardar formatos"
        });
        return;
    }

    // --- FALLBACK: SOPORTE PARA MODO SINGLE (SIN PESTAÑAS) ---
    // Si no hay pestañas pero hay un formulario visible en el contenedor principal
    if (pestanasAbiertas.length === 0) {
        var singleContainer = $("#clinical-form-container");
        if (singleContainer.is(":visible") && singleContainer.find("form").length > 0) {
            var tipo = $("#format-selector").val();
            // Crear "pestaña virtual"
            var tempTab = {
                id: 'clinical-form-container', // El ID del DOM donde está el form
                tipo_formato: tipo,
                nombre: obtenerNombreFormato(tipo),
                datos: {},
                id_atencion_formato: window.formatoActualEditando // Capturar si se está editando
            };
            pestanasAbiertas.push(tempTab);
            console.log("Modo Single detectado. Pestaña virtual creada:", tempTab);
        }
    }

    if (pestanasAbiertas.length === 0) {
        bootbox.alert("No hay formatos abiertos para guardar. Agregue al menos uno.");
        return;
    }

    // Confirmación
    bootbox.confirm({
        message: "<h4><i class='fa fa-check-circle text-success'></i> ¿Finalizar y Firmar?</h4><p>Esto guardará <b>" + pestanasAbiertas.length + "</b> formato(s) y generará los documentos.</p>",
        buttons: {
            confirm: { label: 'Sí, Finalizar', className: 'btn-success' },
            cancel: { label: 'Cancelar', className: 'btn-default' }
        },
        callback: function (result) {
            if (result) {
                ejecutarGuardadoLote(idatencion);
            } else {
                // Si cancela y era modo single, limpiar el array de pestañas para no duplicar lógica
                if (pestanasAbiertas.length === 1 && pestanasAbiertas[0].id === 'clinical-form-container') {
                    pestanasAbiertas = [];
                }
            }
        }
    });
}

function ejecutarGuardadoLote(idatencion) {
    var loading = bootbox.dialog({
        message: '<div class="text-center"><i class="fa fa-spin fa-spinner fa-3x"></i><br><h4>Procesando y Generando Documentos...</h4></div>',
        closeButton: false
    });

    var listaFormatos = [];

    // 1. Recopilar datos
    for (var i = 0; i < pestanasAbiertas.length; i++) {
        var pestana = pestanasAbiertas[i];
        var tabContent = $("#" + pestana.id);
        var formulario = tabContent.find("form")[0];

        if (formulario) {
            var objetoDatos = {};
            var elementosFormulario = formulario.elements;

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

                    var name = elemento.name;
                    // Manejo de arrays (ej: medicamento[])
                    if (name.endsWith('[]')) {
                        var cleanName = name.slice(0, -2);
                        if (!objetoDatos[cleanName]) {
                            objetoDatos[cleanName] = [];
                        }
                        objetoDatos[cleanName].push(elemento.value);
                    } else {
                        objetoDatos[name] = elemento.value;
                    }
                }
            }

            // CRÍTICO: Agregar diagnósticos CIE-10 globales a TODOS los formatos
            if (typeof currentDiagnosticosCIE10 !== 'undefined' && currentDiagnosticosCIE10.length > 0) {
                objetoDatos['codigos_cie10'] = [];
                objetoDatos['enfermedades_cie10'] = [];
                objetoDatos['tipos_cie10'] = [];

                currentDiagnosticosCIE10.forEach(function (diag) {
                    objetoDatos['codigos_cie10'].push(diag.codigo);
                    objetoDatos['enfermedades_cie10'].push(diag.enfermedad);
                    objetoDatos['tipos_cie10'].push(diag.tipo || 'PRESUNTIVO');
                });

                console.log('Diagnósticos CIE-10 agregados al formato:', objetoDatos['codigos_cie10']);
            } else {
                console.warn('No hay diagnósticos CIE-10 en currentDiagnosticosCIE10');
            }

            listaFormatos.push({
                tipo_formato: pestana.tipo_formato,
                id_atencion_formato: pestana.id_atencion_formato,
                datos_json: JSON.stringify(objetoDatos)
            });
        }
    }

    // 2. Enviar Batch
    $.ajax({
        url: "../ajax/atencion_formatos.php?op=guardar_lote",
        type: "POST",
        data: {
            idatencion: idatencion,
            formatos: JSON.stringify(listaFormatos)
        },
        dataType: "json",
        success: function (response) {
            loading.modal('hide');
            if (response.success) {
                // --- SUBIDA DE ARCHIVOS SECUENCIAL (Post-Guardado) ---
                if (typeof window.filesQueue !== 'undefined' && window.filesQueue.length > 0) {
                    var filesFormData = new FormData();
                    filesFormData.append('idatencion', idatencion);

                    for (var k = 0; k < window.filesQueue.length; k++) {
                        filesFormData.append("archivos_adjuntos[]", window.filesQueue[k]);
                    }

                    var uploadMsg = bootbox.dialog({ message: '<i class="fa fa-spinner fa-spin"></i> Subiendo archivos adjuntos...', closeButton: false });

                    $.ajax({
                        url: "../ajax/subir_archivos.php",
                        type: "POST",
                        data: filesFormData,
                        contentType: false,
                        processData: false,
                        dataType: "json",
                        success: function (respFiles) {
                            uploadMsg.modal('hide');
                            console.log("Subida POST-SAVE:", respFiles);
                            if (respFiles.status === 'success') {
                                window.filesQueue = [];
                                if (typeof window.renderFilesQueue === 'function') window.renderFilesQueue();
                            } else {
                                bootbox.alert("Advertencia: Los formatos se guardaron, pero hubo un error subiendo archivos: " + respFiles.message);
                            }
                        },
                        error: function () {
                            uploadMsg.modal('hide');
                            bootbox.alert("Error de conexión al subir archivos adjuntos.");
                        }
                    });
                }

                // ----------------------------------------------------

                // Mostrar mensaje de éxito y abrir PDFs
                bootbox.alert("<i class='fa fa-check text-success'></i> " + response.message, function () {
                    // Verificamos si había una receta en el lote para abrir la interfaz de firma
                    var huboReceta = listaFormatos.some(function (f) { return f.tipo_formato === 'RECETA'; });

                    if (huboReceta) {
                        window.open("../reportes/receta.php?idatencion=" + idatencion, '_blank');
                    }

                    // 3. Abrir PDFs de los otros formatos
                    if (response.archivos && response.archivos.length > 0) {
                        response.archivos.forEach(function (ruta, index) {
                            if (huboReceta && ruta.indexOf('recetas_generadas') !== -1) {
                                return;
                            }
                            setTimeout(function () {
                                window.open("../" + ruta, '_blank');
                            }, index * 300);
                        });
                    }

                    // 4. Verificar si hay Bitácora y generar su PDF
                    $.post("../ajax/bitacora.php?op=verificar_bitacora",
                        { idatencion: idatencion },
                        function (bitacoraResp) {
                            if (bitacoraResp.tiene_bitacora) {
                                // Abrir PDF de Bitácora (MSP 005)
                                setTimeout(function () {
                                    window.open("../reportes/generar_pdf_msp_005.php?idatencion=" + idatencion, '_blank');
                                }, 500);
                            }
                        },
                        "json"
                    );

                    // 5. Cerrar pestañas y actualizar
                    while (pestanasAbiertas.length > 0) {
                        cerrarPestanaSinConfirmar(pestanasAbiertas[0].id);
                    }

                    // Actualizar lista guardados
                    listarFormatosCompletados(idatencion);
                });
            } else {
                bootbox.alert("<i class='fa fa-times text-danger'></i> Error: " + response.message);
            }
        },
        error: function (e) {
            loading.modal('hide');
            console.error("Error en guardado en lote:", e);

            var msg = "<h4><i class='fa fa-exclamation-triangle text-danger'></i> Error de comunicación con el servidor</h4>";

            if (e.responseText) {
                try {
                    var errorData = JSON.parse(e.responseText);
                    if (errorData.message) {
                        msg += "<p><strong>Detalle:</strong> " + errorData.message + "</p>";
                    } else {
                        msg += "<p>Respuesta del servidor:</p><textarea class='form-control' rows='10' style='width:100%; font-family: monospace;'>" + e.responseText + "</textarea>";
                    }
                } catch (parseError) {
                    msg += "<p>Respuesta del servidor:</p><textarea class='form-control' rows='10' style='width:100%; font-family: monospace;'>" + e.responseText + "</textarea>";
                }
            } else {
                msg += "<p>No se recibió respuesta del servidor (Error " + e.status + ")</p>";
                msg += "<p><strong>Posibles causas:</strong></p>";
                msg += "<ul>";
                msg += "<li>Faltan diagnósticos CIE-10 en el Plan de Atención</li>";
                msg += "<li>Error en la configuración del servidor</li>";
                msg += "<li>Problema de permisos en carpetas del sistema</li>";
                msg += "</ul>";
            }

            bootbox.alert(msg);
        }
    });
}

// ===================================
// FUNCIÓN PARA REABRIR TODOS LOS FORMATOS
// ===================================
function reabrirTodosFormatos() {
    var idatencion = $("#idatencion").val();
    if (!idatencion) return;

    $.post("../ajax/atencion_formatos.php?op=listar", { idatencion: idatencion }, function (data) {
        try {
            var formatos = JSON.parse(data);
            if (formatos.length > 0) {
                function abrirSiguiente(index) {
                    if (index >= formatos.length) {
                        bootbox.alert("Todos los formatos han sido reabiertos.");
                        return;
                    }

                    var f = formatos[index];
                    editarFormatoEnPestana(f.id_atencion_formato);

                    setTimeout(function () {
                        abrirSiguiente(index + 1);
                    }, 300);
                }

                abrirSiguiente(0);
            } else {
                bootbox.alert("No hay formatos guardados para reabrir.");
            }
        } catch (e) {
            console.error(e);
        }
    });
}
