// ==========================================
// almacen.js - MODULAR, OPTIMIZADO, ESTABLE Y ACCESIBLE
// ==========================================

(() => {
    "use strict";

    /* =========================================================
       STORE
       ========================================================= */
    const Store = {
        datosOriginales: [],
        datosFiltrados: [],
        datosPaginados: [],
        orden: { columna: null, direccion: 1 },
        paginaActual: 1,
        registrosPorPagina: 10,
        ultimoFoco: null
    };

    /* =========================================================
       UTILS
       ========================================================= */
    const Utils = {
        obtenerIpTienda() {
            return $("select[name='tienda_ip']").val()
                || $("#ip_ecp").val()
                || null;
        },

        mensaje(texto) {
            alert(texto);
        },

        debounce(fn, wait = 300) {
            let t;
            return (...args) => {
                clearTimeout(t);
                t = setTimeout(() => fn.apply(this, args), wait);
            };
        },

        toFloat(v) {
            const n = parseFloat(String(v ?? "").replace(/,/g, ""));
            return isNaN(n) ? 0 : n;
        }
    };

    /* =========================================================
       API
       ========================================================= */
    const API = {
        buscarArticulos(criterio, ip) {
            return $.post("../controllers/ArticuloController.php", { criterio, ip }, "json");
        },

        detalleArticulo(id, ip) {
            return $.post("../controllers/ArticuloController.php", { id_detalle: id, ip }, "json");
        },

        generarPDF(tablaHtml, titulo) {
            return $.ajax({
                url: "../../report/inventario_pdf.php",
                method: "POST",
                data: { tabla: tablaHtml, titulo },
                xhrFields: { responseType: "arraybuffer" }
            });
        }
    };

 
        /* =========================================================
       EXPORTER: CSV y PDF
       ========================================================= */
        const Exporter = {
            exportCSV() {
                if (!Store.datosFiltrados.length) {
                    Utils.mensaje("No hay datos.");
                    return;
                }
                let csv = "ID;Descripción;Marca;Unidad;Stock\n";
                Store.datosFiltrados.forEach(item => {
                    csv += `${item.AR_IdArticulo};"${(item.AR_Descripcion ?? "")} ${(item.AR_Presentacion ?? "")}";${item.MA_Descripcion ?? ""};${item.UN_Abr ?? item.UN_Descripcion ?? ""};${item.SA_Saldo_Actual ?? 0}\n`;
                });
                const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
                const a = document.createElement("a");
                a.href = URL.createObjectURL(blob);
                a.download = "inventario.csv";
                a.click();
                URL.revokeObjectURL(a.href);
            },

            exportPDF() {
                if (!Store.datosFiltrados.length) {
                    Utils.mensaje("No hay datos.");
                    return;
                }

                const tablaHTML = `
                    <table width="100%" border="1" cellspacing="0" cellpadding="4"
                        style="border-collapse:collapse; table-layout:fixed; font-size:10px;">
                        <thead>
                            <tr style="background:#eaeaea; font-weight:bold;">
                                <th style="width:10%;">ID</th>
                                <th style="width:50%;">Descripción</th>
                                <th style="width:15%;">Marca</th>
                                <th style="width:10%;">Unidad</th>
                                <th style="width:15%;">Stock</th>
                            </tr>
                        </thead>
                        <tbody>
                            ${Store.datosFiltrados.map(item => `
                                <tr>
                                    <td style="width:10%;">${item.AR_IdArticulo}</td>
                                    <td style="width:50%; word-wrap:break-word;">
                                        ${(item.AR_Descripcion ?? "")} ${(item.AR_Presentacion ?? "")}
                                    </td>
                                    <td style="width:15%;">${item.MA_Descripcion ?? ""}</td>
                                    <td style="width:10%;">${item.UN_Abr ?? item.UN_Descripcion ?? ""}</td>
                                    <td style="width:15%; text-align:right;">
                                        ${item.SA_Saldo_Actual ?? 0}
                                    </td>
                                </tr>
                            `).join("")}
                        </tbody>
                    </table>
                `;

                API.generarPDF(tablaHTML, "REPORTE DE ALMACÉN")
                    .done(data => {
                        const blob = new Blob([data], { type: "application/pdf" });
                        const url = URL.createObjectURL(blob);
                        const a = document.createElement("a");
                        a.href = url;
                        a.download = "reporte_almacen.pdf";
                        a.click();
                        URL.revokeObjectURL(url);
                    })
                    .fail(() => Utils.mensaje("No se pudo generar el PDF."));
            }
        };






    
    /* =========================================================
       SORTER
       ========================================================= */
    const Sorter = {
        toggle(col) {
            if (Store.orden.columna === col) {
                Store.orden.direccion *= -1;
            } else {
                Store.orden.columna = col;
                Store.orden.direccion = 1;
            }
        },

        aplicar() {
            const { columna, direccion } = Store.orden;
            if (!columna) return;

            Store.datosFiltrados.sort((a, b) => {
                const x = a[columna] ?? "";
                const y = b[columna] ?? "";

                const nx = Number(String(x).replace(/[^0-9.-]/g, ""));
                const ny = Number(String(y).replace(/[^0-9.-]/g, ""));

                if (!isNaN(nx) && !isNaN(ny)) {
                    return (nx - ny) * direccion;
                }

                return String(x).localeCompare(String(y)) * direccion;
            });
        }
    };

    /* =========================================================
       PAGER
       ========================================================= */
    const Pager = {
        reiniciar() {
            Store.paginaActual = 1;
        },

        paginar() {
            const ini = (Store.paginaActual - 1) * Store.registrosPorPagina;
            Store.datosPaginados = Store.datosFiltrados.slice(
                ini,
                ini + Store.registrosPorPagina
            );
        },

        render() {
            const total = Math.ceil(Store.datosFiltrados.length / Store.registrosPorPagina);
            const $p = $("#paginacion");

            if (total <= 1) return $p.empty();

            let html = "";
            for (let i = 1; i <= total; i++) {
                html += `
                    <li class="page-item ${i === Store.paginaActual ? "active" : ""}">
                        <a class="page-link" href="#" data-pag="${i}">${i}</a>
                    </li>`;
            }
            $p.html(html);
        }
    };

    /* =========================================================
       RENDERER
       ========================================================= */
    const Renderer = {
        tabla() {
            const $t = $("#tablaDatos");

            if (!Store.datosPaginados.length) {
                return $t.html(`<tr><td colspan="5">⚠ No hay datos</td></tr>`);
            }

            $t.html(Store.datosPaginados.map(d => `
                <tr class="fila-producto" data-id="${d.AR_IdArticulo}" tabindex="0">
                    <td>${d.AR_IdArticulo}</td>
                    <td class="text-start">${d.AR_Descripcion ?? ""} ${d.AR_Presentacion ?? ""}</td>
                    <td>${d.MA_Descripcion ?? ""}</td>
                    <td>${d.UN_Abr ?? d.UN_Descripcion ?? ""}</td>
                    <td>${d.SA_Saldo_Actual ?? 0}</td>
                </tr>
            `).join(""));
        },

        detalle(d) {
            if (!d) return;

            $("#detalleId").text(d.AR_IdArticulo);
            $("#detalleDescripcion").text(d.AR_Descripcion);
            $("#detallePresentacion").text(d.AR_Presentacion);
            $("#detalleMarca").text(d.MA_Descripcion);
            $("#detalleUnidad").text(d.UN_Abr ?? d.UN_Descripcion);
            $("#detallePrecio1").text(d.AR_PrecioVenta1);
            $("#detallePrecio2").text(d.AR_PrecioVenta2);
            $("#detallePrecio3").text(d.AR_PrecioVenta3);
            $("#detallependiente").text(d.SA_Saldo_Pendiente_Entrega);
            $("#detalleSaldo").text(d.SA_Saldo_Actual);
        }
    };

    /* =========================================================
       FILTRO STOCK
       ========================================================= */
    function aplicarFiltroStock() {
        const soloPositivos = !$("#chkFiltroStock").is(":checked");

        Store.datosFiltrados = Store.datosOriginales.filter(x => {
            const s = Utils.toFloat(x.SA_Saldo_Actual);
            return soloPositivos ? s > 0 : s <= 0;
        });

        $("#lblFiltroStock").text(
            soloPositivos ? "Solo positivos" : "Negativos y ceros"
        );
    }

    /* =========================================================
       BÚSQUEDA
       ========================================================= */
    function ejecutarBusqueda() {
        const criterio = $("#busquedaInput").val().trim();
        const ip = Utils.obtenerIpTienda();

        if (!ip) return Utils.mensaje("Seleccione una tienda.");
        if (!criterio) return;

        $("#tablaDatos").html(`<tr><td colspan="5">🔄 Buscando...</td></tr>`);

        API.buscarArticulos(criterio, ip)
            .done(res => {
                Store.datosOriginales = Array.isArray(res) ? res : [];
                aplicarFiltroStock();
                Sorter.aplicar();
                Pager.reiniciar();
                Pager.paginar();
                Renderer.tabla();
                Pager.render();
            })
            .fail(() => {
                $("#tablaDatos").html(`<tr><td colspan="5">❌ Error de conexión</td></tr>`);
            });
    }

 

/* ============================
   ACTUALIZAR UI (DESKTOP + MOBILE)
   ============================ */
function actualizarNombreUI(nombre) {
    document.querySelectorAll(".brand-name, .mobile-title")
        .forEach(el => {
            if (el) el.innerText = nombre;
        });
}


/* ============================
   SESIÓN TIENDA
   ============================ */
function setNombreTienda(selectOrOption) {
    if (!selectOrOption) return;

    const opt = (selectOrOption.tagName &&
        selectOrOption.tagName.toLowerCase() === "select")
        ? selectOrOption.options[selectOrOption.selectedIndex]
        : selectOrOption;

    if (!opt) return;

    const nombre = opt.dataset?.name || "Seleccione una tienda";
    const ip_real = opt.dataset?.ip || "";
    const ip_enc = opt.value || "";

    // input oculto
    const input = document.getElementById("tienda_nombre");
    if (input) input.value = nombre;

    // ✅ actualizar UI inmediatamente
    actualizarNombreUI(nombre);

    // ✅ FIX MOBILE: asegurar render
    setTimeout(() => {
        actualizarNombreUI(nombre);
    }, 50);

    // ✅ guardar en localStorage (persistencia)
    localStorage.setItem("tienda_nombre", nombre);

    // guardar en sesión (backend)
    $.post("../controllers/TiendaController.php", {
        nombre,
        ip_real,
        ip_enc
    }).fail(() => {
        console.warn("No se pudo guardar la tienda en sesión.");
    });
}


    /* =========================================================
       EVENTOS
       ========================================================= */
    function bindEvents() {

        $("#btnBuscarLupa").on("click", ejecutarBusqueda);

        $("#busquedaInput").on("keyup", Utils.debounce(e => {
            if (e.key === "Enter") ejecutarBusqueda();
        }));

        $("select[name='tienda_ip']").on("change", function () {
            setNombreTienda(this);
        });

        $("#chkFiltroStock").on("change", () => {
            aplicarFiltroStock();
            Sorter.aplicar();
            Pager.reiniciar();
            Pager.paginar();
            Renderer.tabla();
            Pager.render();
        });

        $(document).on("click", "#paginacion .page-link", e => {
            e.preventDefault();
            Store.paginaActual = Number($(e.target).data("pag"));
            Pager.paginar();
            Renderer.tabla();
            Pager.render();
        });

        $(document).on("click", ".sortable", function () {
            const col = $(this).data("col");
            if (!col) return;

            Sorter.toggle(col);

            $(".sortable").each(function () {
                $(this).text($(this).data("label"));
            });

            const flecha = Store.orden.direccion === 1 ? " ↑" : " ↓";
            $(this).text($(this).data("label") + flecha);

            Sorter.aplicar();
            Pager.reiniciar();
            Pager.paginar();
            Renderer.tabla();
            Pager.render();
        });

        // export
        $("#btnExportExcel").off("click").on("click", Exporter.exportCSV);
        $("#btnExportPDF").off("click").on("click", Exporter.exportPDF);


        /* =====================================================
           MODAL ACCESIBLE – FIX aria-hidden + focus
           ===================================================== */

        $(document).on("click", ".fila-producto", function () {
            const id = $(this).data("id");
            const ip = Utils.obtenerIpTienda();
            if (!id || !ip) return;

            Store.ultimoFoco = this;

            API.detalleArticulo(id, ip).done(d => {
                Renderer.detalle(d);
                const modalEl = document.getElementById("modalDetalle");
                const modal = bootstrap.Modal.getOrCreateInstance(modalEl);
                modal.show();
            });
        });

        // 🔑 Quitar foco ANTES de que Bootstrap aplique aria-hidden
        $("#modalDetalle").on("hide.bs.modal", function () {
            const active = document.activeElement;
            if (this.contains(active)) {
                active.blur();
            }
        });

        // 🔁 Devolver foco al elemento original
        $("#modalDetalle").on("hidden.bs.modal", function () {
            if (Store.ultimoFoco) {
                Store.ultimoFoco.focus();
                Store.ultimoFoco = null;
            }
        });
    }

    /* =========================================================
       INIT
       ========================================================= */
    $(document).ready(() => {
        bindEvents();
    });

})();
