var tabla;

// Función que se ejecuta al inicio
function init() {
    mostrarform(false);
    listar();

    // Si estuviéramos en nueva factura:
    $("#formularioregistros").on("submit", function (e) {
        emitirFactura(e);
    });
}

// Función limpiar (si fuera necesaria campos extra)
function limpiar() {
    $("#razon_social").val("");
    $("#ruc_cliente").val("");
    $("#total_sin_impuestos").val("");
    $("#total_pagar").val("");
    $("#detalles tbody").html("");
    cont = 0;
    detalles = 0;
    $("#lbl_total_sin_impuestos").html("0.00");
    $("#lbl_iva_12").html("0.00");
    $("#lbl_iva_15").html("0.00");
    $("#lbl_total_pagar").html("0.00");
    agregarDetalle(); // Agregar una fila vacía por defecto
}

// Función mostrar formulario
function mostrarform(flag) {
    limpiar();
    if (flag) {
        $("#listadoregistros").hide();
        $("#formularioregistros").show();
        $("#btnGuardar").prop("disabled", false);
        $("#btnagregar").hide();
        $("#btnHeaderRide").hide(); // Ocultar boton RIDE al entrar al formulario
        verificarFirmaGuardada(); // CHEQUEAR AL ABRIR FORM
    } else {
        $("#listadoregistros").show();
        $("#formularioregistros").hide();
        $("#btnagregar").show();
        // No ocultamos btnHeaderRide aquí para que se vea tras emitir, 
        // pero idealmente se debería ocultar al navegar o recargar,
        // sin embargo, el usuario quiere verlo tras emitir.
    }
}

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/facturacion_sri.php?op=listar',
            type: "get",
            dataType: "json",
            error: function (e) {
                console.log(e.responseText);
            }
        },
        "bDestroy": true,
        "iDisplayLength": 5, // Paginación
        "language": {
            "emptyTable": (typeof window.EMPTY_STATE_FACTURAS !== 'undefined') ? window.EMPTY_STATE_FACTURAS : 'Aún no has emitido facturas.',
            "zeroRecords": (typeof window.ZERO_RECORDS_FACTURAS !== 'undefined') ? window.ZERO_RECORDS_FACTURAS : 'No se encontraron resultados.'
        },
        "order": [[0, "desc"]] // Ordenar (columna,orden)
    }).DataTable();
}

// Función para verificar estado en el SRI (Para corregir EN_PROCESO)
function verificarEstadoSRI(claveAcceso) {
    bootbox.confirm("¿Está seguro de verificar el estado en el SRI nuevamente?", function (result) {
        if (result) {
            $.post("../ajax/facturacion_sri.php?op=consultar_estado", { claveAcceso: claveAcceso }, function (data, status) {
                var resp = (typeof data === 'string') ? JSON.parse(data) : data;
                if (resp.success) {
                    bootbox.alert("Nuevo Estado: " + resp.estado + "<br>" + resp.message);
                    tabla.ajax.reload();
                } else {
                    bootbox.alert("Error: " + resp.message);
                }
            });
        }
    });
}


// --- LOGICA DE FACTURACION ---

var cont = 0;
var detalles;
// Ya no necesitamos guardarFirmaOnly, el certificado se gestiona en configuracion_firma.php

// Función para verificar firma al cargar
function verificarFirmaGuardada() {
    console.log("=== VERIFICANDO CERTIFICADO EN CONFIGURACION_FIRMA ===");
    $.get("../ajax/gestion_certificados.php?op=verificar_estado", function (r) {
        console.log("Respuesta RAW del servidor:", r);
        try {
            var data = (typeof r === 'string') ? JSON.parse(r) : r;
            console.log("Datos parseados:", data);
            console.log("¿Existe certificado?:", data.existe);

            if (data.existe) {
                console.log("✓ CERTIFICADO EXISTE - Mostrando banner verde");
                // CERTIFICADO EXISTE: Mostrar banner verde
                $("#divFirmaGuardada").show();
                $("#divSinCertificado").hide();
                $("#divDatosEmisor").show();
            } else {
                console.log("✗ CERTIFICADO NO EXISTE - Mostrando mensaje de error");
                // NO EXISTE: Mostrar mensaje de error con link
                $("#divFirmaGuardada").hide();
                $("#divSinCertificado").show();
                $("#divDatosEmisor").hide();
            }
        } catch (e) {
            console.error("ERROR verificando certificado:", e);
            console.error("Respuesta que causó el error:", r);
            // En caso de error, mostrar mensaje de error
            $("#divFirmaGuardada").hide();
            $("#divSinCertificado").show();
            $("#divDatosEmisor").hide();
        }
    }).fail(function (xhr, status, error) {
        console.error("ERROR AJAX verificando certificado:");
        console.error("Status:", status);
        console.error("Error:", error);
        console.error("Response:", xhr.responseText);
        // En caso de error, mostrar mensaje de error
        $("#divFirmaGuardada").hide();
        $("#divSinCertificado").show();
        $("#divDatosEmisor").hide();
    });
}

// Ya no necesitamos eliminarFirma aquí, se gestiona en configuracion_firma.php

function agregarDetalle() {
    var fila = '<tr class="filas" id="fila' + cont + '">' +
        '<td><button type="button" class="btn btn-danger" onclick="eliminarDetalle(' + cont + ')">X</button></td>' +
        '<td><input type="text" class="form-control" name="descripcion[]" id="descripcion' + cont + '" value="CONSULTA MEDICA GENERAL" required></td>' +
        '<td><input type="number" class="form-control" name="cantidad[]" id="cantidad' + cont + '" value="1" min="1" onchange="modificarSubototales()"></td>' +
        '<td><input type="number" class="form-control" name="precio[]" id="precio' + cont + '" value="0.00" step="0.01" min="0" onchange="modificarSubototales()"></td>' +
        '<td>' +
        '<select class="form-control" name="impuesto[]" id="impuesto' + cont + '" onchange="modificarSubototales()">' +
        '<option value="0">0%</option>' +
        '<option value="12">12%</option>' +
        '<option value="15">15%</option>' +
        '</select>' +
        '</td>' +
        '<td><span id="subtotal' + cont + '" name="subtotal">0.00</span></td>' +
        '</tr>';
    cont++;
    detalles++;
    $('#detalles').append(fila);
    modificarSubototales();
}

function modificarSubototales() {
    var cant = document.getElementsByName("cantidad[]");
    var prec = document.getElementsByName("precio[]");
    var imp = document.getElementsByName("impuesto[]");
    var sub = document.getElementsByName("subtotal");

    var totalSinImpuestos = 0.0;
    var totalIva12 = 0.0;
    var totalIva15 = 0.0;

    for (var i = 0; i < cant.length; i++) {
        var cantidad = parseFloat(cant[i].value);
        var precio = parseFloat(prec[i].value);
        var impuesto = parseInt(imp[i].value);

        // Validar inputs NaN
        cantidad = isNaN(cantidad) ? 0 : cantidad;
        precio = isNaN(precio) ? 0 : precio;

        var subtotal = cantidad * precio;
        // Fix: getElementsByName returns NodeList, need index access for innerHTML if trying to set specific span
        // But here sub is also NodeList
        if (sub[i]) sub[i].innerHTML = subtotal.toFixed(2);

        totalSinImpuestos += subtotal;

        if (impuesto == 12) {
            totalIva12 += subtotal * 0.12;
        } else if (impuesto == 15) {
            totalIva15 += subtotal * 0.15;
        }
    }

    var totalPagar = totalSinImpuestos + totalIva12 + totalIva15;

    $("#lbl_total_sin_impuestos").html(totalSinImpuestos.toFixed(2));
    $("#total_sin_impuestos").val(totalSinImpuestos.toFixed(2));

    $("#lbl_iva_12").html(totalIva12.toFixed(2));
    $("#lbl_iva_15").html(totalIva15.toFixed(2));

    $("#lbl_total_pagar").html(totalPagar.toFixed(2));
    $("#total_pagar").val(totalPagar.toFixed(2));
}

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

function emitirFactura() {
    // Validación básica de campos requeridos
    if ($("#razon_social").val().trim() == "") { bootbox.alert("Cliente requerido"); return; }
    if ($("#ruc_cliente").val().trim() == "") { bootbox.alert("RUC Cliente requerido"); return; }
    if ($("#ruc_emisor").val().trim() == "") { bootbox.alert("RUC Emisor requerido"); return; }
    if ($("#password_firma").val().trim() == "") { bootbox.alert("Contraseña de firma requerida"); return; }

    // Verificar que el formulario de datos esté visible (significa que hay certificado)
    if ($("#divDatosEmisor").is(":hidden")) {
        bootbox.alert("No tiene un certificado digital configurado. Por favor, vaya a Configuración de Firma Digital para subir su certificado .p12 primero.");
        return;
    }

    // --- VALIDACIÓN ESTRICTA DE ITEMS ANTES DE ENVIAR ---
    var cant = document.getElementsByName("cantidad[]");
    var desc = document.getElementsByName("descripcion[]");
    var prec = document.getElementsByName("precio[]");
    var imp = document.getElementsByName("impuesto[]");

    if (cant.length === 0) {
        bootbox.alert("Debe agregar al menos un detalle a la factura.");
        return;
    }

    var items = [];
    for (var i = 0; i < cant.length; i++) {
        var cantidad = parseFloat(cant[i].value);
        var precio = parseFloat(prec[i].value);
        var impuesto = parseInt(imp[i].value);
        var descripcion = desc[i].value;

        // Validaciones individuales
        if (cantidad <= 0) { bootbox.alert("Error en línea " + (i + 1) + ": Cantidad debe ser mayor a 0"); return; }
        if (precio < 0) { bootbox.alert("Error en línea " + (i + 1) + ": Precio no puede ser negativo"); return; }
        if (descripcion.trim() === "") { bootbox.alert("Error en línea " + (i + 1) + ": Descripción requerida"); return; }

        // Validación CRÍTICA de impuestos
        if (![0, 12, 15].includes(impuesto)) {
            bootbox.alert("Error CRÍTICO en línea " + (i + 1) + ": Porcentaje de IVA incorrecto (" + impuesto + "%). Solo se permite 0%, 12% o 15%.");
            return;
        }

        var total = cantidad * precio;

        items.push({
            codigo: 'AUX-' + (i + 1),
            descripcion: descripcion,
            cantidad: cantidad,
            precio: precio,
            total: total,
            impuesto: impuesto
        });
    }

    $("#btnGuardar").prop("disabled", true);
    var formData = new FormData($("#formulario")[0]);

    formData.append('items', JSON.stringify(items));
    formData.append('password', $("#password_firma").val());
    formData.append('total', $("#total_pagar").val());
    formData.append('ruc_emisor', $("#ruc_emisor").val());
    formData.append('op', 'emitir');

    // MENSJE DE ESPERA ELEGANTE
    var dialogEspere = bootbox.dialog({
        message: '<div class="text-center"><div class="lds-ring"><div></div><div></div><div></div><div></div></div><h4 style="margin-top:15px; color:#555;">Validando con SRI...</h4><p>Por favor espere, estamos autorizando su comprobante.</p></div>',
        closeButton: false,
        title: "Procesando Factura",
        className: "modal-procesando"
    });

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

        success: function (datos) {
            dialogEspere.modal('hide'); // CERRAR SPINNNER
            console.log("--- RESPUESTA SERVIDOR ---");
            console.log("Tipo:", typeof datos);
            console.log("Valor:", datos);

            try {
                // 1. Detección de error raro "[object Object]" literal
                if (datos === "[object Object]") {
                    console.error("Detectada respuesta '[object Object]' literal. El servidor devolvió un objeto stringificado incorrectamente o jQuery falló.");
                    bootbox.alert("Error de comunicación: El servidor devolvió una respuesta inválida ([object Object]). Por favor verifique los logs de PHP o contacte soporte.");
                    $("#btnGuardar").prop("disabled", false);
                    return;
                }

                // 2. Parsing Inteligente
                var resp;
                if (typeof datos === 'object' && datos !== null) {
                    resp = datos; // Ya es objeto (jQuery lo parseó por header json)
                } else {
                    resp = JSON.parse(datos); // Es string, parsear
                }

                if (resp.success) {
                    var mensajeFinal = resp.mensaje + "<br>Clave: " + resp.claveAcceso;

                    // Configurar y mostrar el botón VER RIDE en la cabecera
                    var rutaRide = "../ajax/generar_ride.php?claveAcceso=" + resp.claveAcceso;
                    $("#btnHeaderRide").attr("href", rutaRide);
                    $("#btnHeaderRide").show();

                    // --- NUEVO: Logica de Polling si está PENDIENTE ---
                    if (resp.etapa === 'AUTORIZACION_PENDIENTE' || resp.etapa === 'RECIBIDA') {
                        bootbox.dialog({
                            message: '<div class="text-center"><i class="fa fa-spin fa-spinner"></i> Factura ENVIADA al SRI. <br>Esperando autorización final...<br>Esto se cerrará automáticamente al finalizar.</div>',
                            closeButton: false,
                            className: "modal-polling"
                        });

                        // Iniciar polling
                        iniciarPollingAutorizacion(resp.claveAcceso, 1);
                    } else {
                        // Respuesta final inmediata (Autorizado o Rechazado definitivamente)
                        bootbox.alert(mensajeFinal, function () {
                            mostrarform(false);
                            if (tabla) {
                                tabla.ajax.reload();
                            } else {
                                listar();
                            }
                        });
                    }

                } else {
                    if (resp.estado === 'TIEMPO_EXCEDIDO') {
                        bootbox.alert(resp.message, function () {
                            mostrarform(false);
                            tabla.ajax.reload();
                        });
                    } else {
                        bootbox.alert("Mensaje del Sistema: " + resp.message);
                    }
                }

            } catch (e) {
                console.error("Excepción JS:", e);
                bootbox.alert("Excepción JS procesando respuesta.<br>Error: " + e.message + "<br>Tipo dato recibido: " + (typeof datos));
            }
            $("#btnGuardar").prop("disabled", false);
        },
        error: function (jqXHR, textStatus, errorThrown) {
            dialogEspere.modal('hide'); // CERRAR SPINNNER
            console.error("Error AJAX FATAL:", textStatus, errorThrown);
            console.log("Respuesta Texto:", jqXHR.responseText);
            bootbox.alert("ERROR DE CONEXIÓN O SERVIDOR: " + errorThrown + "<br>Ver consola para detalles.");
            $("#btnGuardar").prop("disabled", false);
        }
    });
}

// Nueva función de polling recursivo
function iniciarPollingAutorizacion(claveAcceso, intento) {
    if (intento > 20) { // Timeout tras ~60 segundos (20 * 3s)
        bootbox.hideAll();
        bootbox.alert("El SRI recibió exitosamente su factura, se mostrara autorizada en el portal en 24 horas , revise su Ride en Historial.", function () {
            mostrarform(false);
            if (tabla) tabla.ajax.reload();
            else listar();
        });
        return;
    }

    setTimeout(function () {
        $.post("../ajax/facturacion_sri.php?op=consultar_estado", { claveAcceso: claveAcceso }, function (data) {
            var resp;
            try {
                resp = (typeof data === 'string') ? JSON.parse(data) : data;
            } catch (e) { console.error("Error parse polling", e); return; }

            console.log("Polling intento " + intento + ": " + resp.estado);

            if (resp.estado === 'AUTORIZADO') {
                bootbox.hideAll();
                bootbox.alert("✅ <b>¡FACTURA AUTORIZADA!</b><br>El SRI ha aprobado el documento exitosamente.", function () {
                    mostrarform(false);
                    if (tabla) tabla.ajax.reload();
                    else listar();
                });
            } else if (resp.estado === 'NO AUTORIZADO' || resp.estado === 'RECHAZADA' || resp.estado === 'DEVUELTA') {
                bootbox.hideAll();
                bootbox.alert("❌ <b>FACTURA RECHAZADA POR EL SRI</b><br>" + (resp.message || "Revise los datos del cliente e intente de nuevo."), function () {
                    mostrarform(false);
                    if (tabla) tabla.ajax.reload();
                    else listar();
                });
            } else {
                // Sigue en proceso, intentar de nuevo
                iniciarPollingAutorizacion(claveAcceso, intento + 1);
            }
        });
    }, 3000); // 3 segundos
}

function enviarRideEmail(claveAcceso, emailDefault) {
    bootbox.prompt({
        title: "Enviar RIDE por Correo",
        inputType: 'email',
        value: emailDefault,
        callback: function (result) {
            if (result === null) {
                return; // Cancelado
            }
            if (result.trim() === "") {
                bootbox.alert("Debe ingresar un correo válido");
                return;
            }

            var dialog = bootbox.dialog({
                message: '<p class="text-center mb-0"><i class="fa fa-spin fa-spinner"></i> Generando y enviando correo...</p>',
                closeButton: false
            });

            $.post("../ajax/enviar_ride.php", { claveAcceso: claveAcceso, email: result }, function (data) {
                dialog.modal('hide');
                try {
                    var resp = (typeof data === 'string') ? JSON.parse(data) : data;
                    if (resp.success) {
                        bootbox.alert("✅ " + resp.message);
                    } else {
                        bootbox.alert("❌ Error: " + resp.message);
                    }
                } catch (e) {
                    bootbox.alert("❌ Error procesando respuesta del servidor: <br>" + data);
                }
            }).fail(function () {
                dialog.modal('hide');
                bootbox.alert("Error de conexión al intentar enviar el correo.");
            });
        }
    });
}


init();
