var tabla;

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

    // Verificar si hay orden de abrir pago
    const urlParams = new URLSearchParams(window.location.search);
    const idPagoAuto = urlParams.get('abrir_pago');
    const idAtencion = urlParams.get('idatencion');

    if (idPagoAuto) {
        setTimeout(function () {
            $.post("../ajax/odont_presupuesto.php?op=mostrar", { idpresupuesto: idPagoAuto }, function (data) {
                data = JSON.parse(data);
                abrirModalPago(idPagoAuto, data.paciente, data.total);
            });
            window.history.replaceState({}, document.title, "odont_presupuesto.php");
        }, 500);
    }

    if (idAtencion) {
        // Si venimos derivados de Atención Médica/Triaje
        console.log("Derivado de atención: " + idAtencion);
        $.post("../ajax/atencion.php?op=mostrar", { idatencion: idAtencion }, function (data) {
            data = JSON.parse(data);
            if (data) {
                // 1. Filtrar la tabla por el nombre del paciente
                setTimeout(function () {
                    // Usamos el API de DataTable para buscar
                    var datatable = $('#tbllistado').DataTable();
                    datatable.search(data.paciente).draw();
                }, 1000); // Dar tiempo a que cargue la tabla

                // 2. Pre-seleccionar paciente en el formulario de nuevo presupuesto
                // Nota: El selectpicker se carga asincronamente, así que esperamos un poco más o usamos un intervalo
                var attempts = 0;
                var interval = setInterval(function () {
                    if ($("#idpersona option").length > 1) {
                        $("#idpersona").val(data.idpersona);
                        $("#idpersona").selectpicker('refresh');
                        clearInterval(interval);
                    }
                    attempts++;
                    if (attempts > 20) clearInterval(interval); // Timeout 10s
                }, 500);

                // Mostrar alerta visual
                bootbox.alert("Atendiendo a: <b>" + data.paciente + "</b><br>Se han filtrado sus presupuestos previos.");
            }
        });
    }

    $("#formulario").on("submit", function (e) {
        guardaryeditar(e);
    });

    //Cargamos los items al select paciente
    $.post("../ajax/odont_presupuesto.php?op=selectPaciente", function (r) {
        $("#idpersona").html(r);
        if ($("#idpersona").length) $("#idpersona").selectpicker('refresh');
    });

    // Cargar formas de pago
    $.post("../ajax/odont_pago.php?op=listarFormasPago", function (r) {
        $("#idforma_pago").html('<option value="">Seleccione...</option>' + r);
    });

    // Manejar checkbox de cuotas
    $("#tiene_cuotas").on("change", function () {
        if ($(this).is(':checked')) {
            $("#divPlanCuotas").show();
            calcularMontoCuota();
        } else {
            $("#divPlanCuotas").hide();
        }
    });

    // Calcular monto de cuota cuando cambia el número de cuotas
    $("#numero_cuotas").on("change", function () {
        calcularMontoCuota();
    });

    // Manejar submit del formulario de pago
    $("#formPago").on("submit", function (e) {
        e.preventDefault();
        registrarPago();
    });

    // Si tenemos selectpicker, refrescarlo
    if ($(".selectpicker").length) {
        $(".selectpicker").selectpicker('refresh');
    }
}

//Función limpiar
function limpiar() {
    $("#idpresupuesto").val("");
    $("#idpersona").val("");
    $("#fecha_vencimiento").val("");
    $("#observaciones").val("");
    $("#subtotal").val("");
    $("#descuento_total").val("");
    $("#total_venta").val("");

    if ($(".selectpicker").length) {
        $(".selectpicker").selectpicker('refresh');
    }

    $(".filas").remove();
    $("#total").html("S/. 0.00");

    // Limpiar campos de pago
    $("#idforma_pago").val("");
    $("#tiene_cuotas").prop('checked', false);
    $("#divPlanCuotas").hide();
    $("#numero_cuotas").val(3);
    $("#monto_cuota").val("");

    //Obtenemos la fecha actual
    var now = new Date();
    var day = ("0" + now.getDate()).slice(-2);
    var month = ("0" + (now.getMonth() + 1)).slice(-2);
    var today = now.getFullYear() + "-" + (month) + "-" + (day);
    $('#fecha_vencimiento').val(today);
    $('#fecha_inicio_cuotas').val(today);
}

//Función mostrar formulario
function mostrarform(flag) {
    limpiar();
    if (flag) {
        $("#listadoregistros").hide();
        $("#formularioregistros").show();
        $("#btnGuardar").prop("disabled", false);
        $("#btnagregar").hide();
        listarProcedimientos();
    }
    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/odont_presupuesto.php?op=listar',
                type: "get",
                dataType: "json",
                error: function (e) {
                    console.log(e.responseText);
                }
            },
            "bDestroy": true,
            "iDisplayLength": 10,//Paginación
            "order": [[0, "desc"]]//Ordenar (columna,orden)
        }).DataTable();
}

function listarProcedimientos() {
    tabla = $('#tblprocedimientos').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: [

            ],
            "ajax":
            {
                url: '../ajax/odont_procedimiento.php?op=listarActivos',
                type: "get",
                dataType: "json",
                error: function (e) {
                    console.log(e.responseText);
                }
            },
            "bDestroy": true,
            "iDisplayLength": 5,//Paginación
            "order": [[0, "desc"]]//Ordenar (columna,orden)
        }).DataTable();
}

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

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

        success: function (datos) {
            bootbox.alert(datos);
            mostrarform(false);
            listar();
        }

    });
    limpiar();
}

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

        $("#idpersona").val(data.idpersona);
        if ($("#idpersona").length) $("#idpersona").selectpicker('refresh');
        $("#fecha_vencimiento").val(data.fecha_vencimiento);
        $("#observaciones").val(data.observaciones);
        $("#idpresupuesto").val(data.idpresupuesto);

        //Ocultar y mostrar los botones
        $("#btnGuardar").hide();
        $("#btnCancelar").show();
        $("#btnAgregarArt").hide();
    });

    $.post("../ajax/odont_presupuesto.php?op=listarDetalle&id=" + idpresupuesto, function (r) {
        var data = JSON.parse(r);
        for (var i = 0; i < data.length; i++) {
            agregarDetalle(data[i].idprocedimiento, data[i].procedimiento, data[i].precio_unitario, data[i].diente, data[i].cara, data[i].cantidad, data[i].descuento);
        }
        // Deshabilitar edición en modo ver? O permitir editar?
        // Permitiremos editar si el estado no es aprobado/cancelado, pero por ahora mostramos todo.
        // Si el usuario quiere editar, guardaryeditar manejará la actualización.
        $("#btnGuardar").show();
        $("#btnAgregarArt").show();
    });
}

function anular(idpresupuesto) {
    bootbox.confirm("¿Está Seguro de anular el presupuesto?", function (result) {
        if (result) {
            $.post("../ajax/odont_presupuesto.php?op=anular", { idpresupuesto: idpresupuesto }, function (e) {
                bootbox.alert(e);
                tabla.ajax.reload();
            });
        }
    })
}

function aprobar(idpresupuesto) {
    bootbox.confirm("¿Está Seguro de aprobar el presupuesto?", function (result) {
        if (result) {
            $.post("../ajax/odont_presupuesto.php?op=aprobar", { idpresupuesto: idpresupuesto }, function (e) {
                bootbox.alert(e);
                tabla.ajax.reload();
            });
        }
    })
}

var cont = 0;
var detalles = 0;
//$("#btnGuardar").hide();

function agregarDetalle(idprocedimiento, procedimiento, precio, diente = '', cara = '', cantidad = 1, descuento = 0) {
    var subtotal = (cantidad * precio) - descuento;

    // Si no se envian diente/cara (desde modal), default empty

    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="hidden" name="idprocedimiento[]" value="' + idprocedimiento + '">' + procedimiento + '</td>' +
        '<td><input type="text" class="form-control" name="diente[]" value="' + diente + '" placeholder="Ej. 18"></td>' +
        '<td><input type="text" class="form-control" name="cara[]" value="' + cara + '" placeholder="Ej. Oclusal"></td>' +
        '<td><input type="number" class="form-control" name="cantidad[]" id="cantidad' + cont + '" value="' + cantidad + '" min="1" onchange="modificarSubototales()"></td>' +
        '<td><input type="number" class="form-control" name="precio_unitario[]" id="precio_unitario' + cont + '" value="' + precio + '" step="0.01" onchange="modificarSubototales()"></td>' +
        '<td><input type="number" class="form-control" name="descuento[]" value="' + descuento + '" step="0.01" onchange="modificarSubototales()"></td>' +
        '<td><span name="subtotal" id="subtotal' + cont + '">' + subtotal + '</span> <input type="hidden" name="subtotal_detalle[]" value="' + subtotal + '"></td>' +
        '</tr>';
    cont++;
    detalles++;
    $('#detalles').append(fila);
    modificarSubototales();
}

function modificarSubototales() {
    var cant = document.getElementsByName("cantidad[]");
    var prec = document.getElementsByName("precio_unitario[]");
    var desc = document.getElementsByName("descuento[]");
    var sub = document.getElementsByName("subtotal");
    var sub_input = document.getElementsByName("subtotal_detalle[]");

    var total = 0.0;
    var subtotal_acum = 0.0;
    var descuento_acum = 0.0;

    for (var i = 0; i < cant.length; i++) {
        var inpC = cant[i];
        var inpP = prec[i];
        var inpD = desc[i];
        var inpS = sub[i];
        var inpSi = sub_input[i];

        var cantidad = parseFloat(inpC.value);
        var precio = parseFloat(inpP.value);
        var descuento = parseFloat(inpD.value);

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

        var subtotal = (cantidad * precio) - descuento;

        inpS.innerHTML = subtotal.toFixed(2);
        inpSi.value = subtotal.toFixed(2);

        total += subtotal;
        subtotal_acum += (cantidad * precio);
        descuento_acum += descuento;
    }
    $("#total").html("S/. " + total.toFixed(2));
    $("#total_venta").val(total.toFixed(2));
    $("#subtotal").val(subtotal_acum.toFixed(2));
    $("#descuento_total").val(descuento_acum.toFixed(2));

    // Recalcular monto de cuota si está activado
    if ($("#tiene_cuotas").is(':checked')) {
        calcularMontoCuota();
    }

    evaluar();
}

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

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

// Función para calcular monto de cuota
function calcularMontoCuota() {
    var total = parseFloat($("#total_venta").val()) || 0;
    var numero_cuotas = parseInt($("#numero_cuotas").val()) || 1;

    if (total > 0 && numero_cuotas > 0) {
        var monto_cuota = total / numero_cuotas;
        $("#monto_cuota").val(monto_cuota.toFixed(2));
    } else {
        $("#monto_cuota").val("0.00");
    }
}

// Función para abrir modal de pago
function abrirModalPago(idpresupuesto, paciente, total) {
    $("#idpresupuesto_pago").val(idpresupuesto);
    $("#paciente_pago").text(paciente);
    $("#total_presupuesto").text(parseFloat(total).toFixed(2));

    // Resetear estado del formulario/campos
    $("#monto_pago, #idforma_pago_pago, #numero_referencia, #observaciones_pago").prop("disabled", false);
    $("#formPago button[type='submit']").html('<i class="fa fa-save"></i> Registrar Pago').prop("disabled", false).removeClass("btn-success").addClass("btn-primary");
    $("#numero_referencia").val("");
    $("#observaciones_pago").val("");

    // Cargar formas de pago en el modal
    $.post("../ajax/odont_pago.php?op=listarFormasPago", function (r) {
        $("#idforma_pago_pago").html('<option value="">Seleccione...</option>' + r);
    });

    // Obtener total pagado
    $.get("../ajax/odont_pago.php?op=totalPagado&id=" + idpresupuesto, function (data) {
        var resp = JSON.parse(data);
        var total_pagado = parseFloat(resp.total_pagado) || 0;
        // Calcular saldo con precisión de 2 decimales para evitar errores de punto flotante
        var saldo = (parseFloat(total) - total_pagado).toFixed(2);

        $("#total_pagado").text(total_pagado.toFixed(2));
        $("#saldo_pendiente").text(saldo);

        if (parseFloat(saldo) <= 0) {
            // Está pagado completamente
            $("#monto_pago").val("0.00");
            $("#monto_pago, #idforma_pago_pago, #numero_referencia, #observaciones_pago").prop("disabled", true);
            $("#formPago button[type='submit']").html('<i class="fa fa-check"></i> TOTALMENTE PAGADO').prop("disabled", true).removeClass("btn-primary").addClass("btn-success");
        } else {
            // Aún hay saldo
            $("#monto_pago").attr('max', saldo);
            $("#monto_pago").val(saldo);
        }
    });

    $("#modalPago").modal('show');
}

// Función para registrar pago
function registrarPago() {
    var formData = new FormData($("#formPago")[0]);

    $.ajax({
        url: "../ajax/odont_pago.php?op=registrarPago",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,
        success: function (datos) {
            var resp;
            try {
                resp = JSON.parse(datos);
            } catch (e) {
                // Si falla el parseo, asumir que es texto plano (retrocompatibilidad o error)
                bootbox.alert(datos);
                tabla.ajax.reload();
                $("#modalPago").modal('hide');
                return;
            }

            if (resp.status) {
                bootbox.confirm({
                    message: resp.message + "<br><br><b>¿Desea imprimir el Recibo de Pago?</b>",
                    buttons: {
                        confirm: {
                            label: '<i class="fa fa-print"></i> Sí, Imprimir',
                            className: 'btn-success'
                        },
                        cancel: {
                            label: '<i class="fa fa-times"></i> No',
                            className: 'btn-danger'
                        }
                    },
                    callback: function (result) {
                        // 1. Si eligió imprimir, abrir PDF
                        if (result === true) {
                            window.open('../reportes/generar_recibo_pago.php?id=' + resp.idpago, '_blank');
                        }

                        // 2. LIMPIEZA GENERAL (Se ejecuta SIEMPRE: Si, No o Cerrar)

                        // Cerrar Bootbox explícitamente (por si acaso)
                        try { bootbox.hideAll(); } catch (e) { }

                        // Cerrar Modal de Pago (porque el pago YA se registró)
                        $("#modalPago").modal('hide');

                        // Limpieza profunda del DOM
                        setTimeout(function () {
                            $('.bootbox').modal('hide');
                            $('.modal-backdrop').remove();
                            $('body').removeClass('modal-open');
                            $('body').css('padding-right', '');
                        }, 200);

                        // Recargar tabla de pagos
                        tabla.ajax.reload();

                        // Recargar datos del presupuesto principal
                        if (typeof mostrar === "function" && idpresupuesto) {
                            mostrar(idpresupuesto);
                        }

                        // DEVOLVER TRUE SIEMPRE para que Bootbox entienda que debe cerrarse
                        return true;
                    }
                });
            } else {
                bootbox.alert(resp.message);
            }
        },
        error: function () {
            bootbox.alert("Error al registrar el pago");
        }
    });
}

// Función para ver PDF del presupuesto
function verPDF(idpresupuesto) {
    window.open('../reportes/generar_pdf_presupuesto.php?id=' + idpresupuesto, '_blank');
}

init();
