// /home/Autopartes/pos/static/js/inventory.js
// Inventory management UI — rewritten to match design-system HTML structure
// Panels: panel-stock, panel-entradas, panel-salidas, panel-traspasos, panel-ajustes, panel-conteos, panel-alertas

(function () {
    'use strict';

    var API = '/pos/api/inventory';
    var token = localStorage.getItem('pos_token');
    if (!token) { window.location.href = '/pos/login'; return; }

    var headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' };
    var currentPage = 1;
    var currentSearch = '';
    var draftCountId = null;

    // --- API helper ---
    function apiFetch(url, opts) {
        return fetch(url, Object.assign({ headers: headers }, opts || {}))
            .then(function (resp) {
                if (resp.status === 401) {
                    localStorage.removeItem('pos_token');
                    window.location.href = '/pos/login';
                    return null;
                }
                return resp.json();
            });
    }

    // --- Helpers ---
    function fmt(n) { return (parseFloat(n) || 0).toFixed(2); }
    function esc(s) {
        if (!s) return '';
        var d = document.createElement('div');
        d.textContent = s;
        return d.innerHTML;
    }

    // =====================================================================
    //  TAB SWITCHING — uses design-system switchTab() already in the HTML.
    //  We hook into it to trigger data loads when tabs are activated.
    // =====================================================================

    var _origSwitchTab = window.switchTab;
    window.switchTab = function (name) {
        if (typeof _origSwitchTab === 'function') _origSwitchTab(name);
        if (name === 'alertas') loadAlerts();
        if (name === 'stock') loadItems(currentPage);
    };

    // =====================================================================
    //  STOCK / PRODUCTS  (panel-stock)
    // =====================================================================

    function loadItems(page, search) {
        currentPage = page || 1;
        currentSearch = search !== undefined ? search : currentSearch;
        var params = new URLSearchParams({ page: currentPage, per_page: 50 });
        if (currentSearch) params.set('q', currentSearch);

        apiFetch(API + '/items?' + params.toString()).then(function (data) {
            if (!data) return;

            var tbody = document.getElementById('productTableBody');
            var items = data.data || [];
            if (!items.length) {
                tbody.innerHTML = '<tr><td colspan="11" style="text-align:center;padding:30px;color:var(--color-text-muted);">Sin productos</td></tr>';
                document.getElementById('productPagination').innerHTML = '';
                return;
            }

            tbody.innerHTML = items.map(function (it) {
                return '<tr>' +
                    '<td class="td--mono">' + esc(it.barcode) + '</td>' +
                    '<td class="td--mono">' + esc(it.part_number) + '</td>' +
                    '<td class="td--primary">' + esc(it.name) + '</td>' +
                    '<td>' + esc(it.brand) + '</td>' +
                    '<td style="text-align:right" class="td--primary">' + it.stock + '</td>' +
                    '<td style="text-align:right" class="td--amount">$' + fmt(it.cost) + '</td>' +
                    '<td style="text-align:right" class="td--amount">$' + fmt(it.price_1) + '</td>' +
                    '<td style="text-align:right" class="td--amount">$' + fmt(it.price_2) + '</td>' +
                    '<td style="text-align:right" class="td--amount">$' + fmt(it.price_3) + '</td>' +
                    '<td>' + esc(it.location) + '</td>' +
                    '<td>' +
                    '<button class="btn btn--ghost btn--sm" onclick="viewHistory(' + it.id + ')">Historial</button> ' +
                    '<button class="btn btn--ghost btn--sm" onclick="printBarcode(\'' + esc(it.barcode) + '\',\'' + esc(it.part_number) + '\',\'' + esc(it.name) + '\')">Etiqueta</button>' +
                    '</td></tr>';
            }).join('');

            // Pagination
            var pg = data.pagination || {};
            var pgEl = document.getElementById('productPagination');
            if (pg.total_pages > 1) {
                pgEl.innerHTML =
                    '<div class="pagination">' +
                    '<button class="page-btn" ' + (pg.page <= 1 ? 'disabled' : 'onclick="window._loadItems(' + (pg.page - 1) + ')"') + '>&lsaquo;</button>' +
                    '<span style="padding:0 var(--space-2);font-size:var(--text-body-sm);color:var(--color-text-muted);">' + pg.page + ' / ' + pg.total_pages + ' (' + pg.total + ' productos)</span>' +
                    '<button class="page-btn" ' + (pg.page >= pg.total_pages ? 'disabled' : 'onclick="window._loadItems(' + (pg.page + 1) + ')"') + '>&rsaquo;</button>' +
                    '</div>';
            } else {
                pgEl.innerHTML = '<span style="font-size:var(--text-body-sm);color:var(--color-text-muted);">' + (pg.total || 0) + ' productos</span>';
            }
        });
    }

    // Search
    var searchInput = document.getElementById('productSearch');
    var searchTimeout;
    if (searchInput) {
        searchInput.addEventListener('input', function () {
            clearTimeout(searchTimeout);
            searchTimeout = setTimeout(function () {
                loadItems(1, searchInput.value.trim());
            }, 350);
        });
    }

    // =====================================================================
    //  CREATE ITEM  (createModal)
    // =====================================================================

    function showCreateModal() {
        document.getElementById('createModal').classList.add('is-open');
    }
    function closeCreateModal() {
        document.getElementById('createModal').classList.remove('is-open');
        document.getElementById('createResult').innerHTML = '';
    }

    function createItem() {
        var data = {
            part_number: document.getElementById('newPartNumber').value.trim(),
            name: document.getElementById('newName').value.trim(),
            brand: document.getElementById('newBrand').value.trim(),
            barcode: document.getElementById('newBarcode').value.trim() || undefined,
            cost: parseFloat(document.getElementById('newCost').value) || 0,
            price_1: parseFloat(document.getElementById('newPrice1').value) || 0,
            price_2: parseFloat(document.getElementById('newPrice2').value) || 0,
            price_3: parseFloat(document.getElementById('newPrice3').value) || 0,
            min_stock: parseInt(document.getElementById('newMinStock').value) || 0,
            initial_stock: parseInt(document.getElementById('newInitialStock').value) || 0,
            location: document.getElementById('newLocation').value.trim()
        };
        if (!data.part_number || !data.name) {
            document.getElementById('createResult').innerHTML = '<span style="color:var(--color-error);">Numero de parte y nombre son obligatorios</span>';
            return;
        }
        apiFetch(API + '/items', { method: 'POST', body: JSON.stringify(data) }).then(function (result) {
            if (result && result.id) {
                document.getElementById('createResult').innerHTML = '<span style="color:var(--color-success);">Creado ID ' + result.id + ' | Barcode: ' + result.barcode + '</span>';
                loadItems(currentPage);
            } else {
                document.getElementById('createResult').innerHTML = '<span style="color:var(--color-error);">' + (result ? result.error || 'Error' : 'Error de red') + '</span>';
            }
        });
    }

    // =====================================================================
    //  PURCHASE / ENTRADA  (purchaseModal)
    // =====================================================================

    function showPurchaseModal() {
        document.getElementById('purchaseModal').classList.add('is-open');
    }
    function closePurchaseModal() {
        document.getElementById('purchaseModal').classList.remove('is-open');
        document.getElementById('purchaseResult').innerHTML = '';
    }

    function recordPurchase() {
        var data = {
            inventory_id: parseInt(document.getElementById('purchaseItemId').value),
            quantity: parseInt(document.getElementById('purchaseQty').value),
            unit_cost: parseFloat(document.getElementById('purchaseCost').value),
            supplier_invoice: document.getElementById('purchaseInvoice').value.trim(),
            notes: document.getElementById('purchaseNotes').value.trim()
        };
        if (!data.inventory_id || !data.quantity || !data.unit_cost) {
            document.getElementById('purchaseResult').innerHTML = '<span style="color:var(--color-error);">Complete todos los campos obligatorios</span>';
            return;
        }
        apiFetch(API + '/purchase', { method: 'POST', body: JSON.stringify(data) }).then(function (result) {
            document.getElementById('purchaseResult').innerHTML = result && result.operation_id
                ? '<span style="color:var(--color-success);">Compra registrada (op #' + result.operation_id + ')</span>'
                : '<span style="color:var(--color-error);">' + (result ? result.error || 'Error' : 'Error de red') + '</span>';
        });
    }

    // =====================================================================
    //  ADJUSTMENT / AJUSTE  (adjustmentModal)
    // =====================================================================

    function showAdjustmentModal() {
        document.getElementById('adjustmentModal').classList.add('is-open');
    }
    function closeAdjustmentModal() {
        document.getElementById('adjustmentModal').classList.remove('is-open');
        document.getElementById('adjustResult').innerHTML = '';
    }

    function recordAdjustment() {
        var data = {
            inventory_id: parseInt(document.getElementById('adjustItemId').value),
            quantity: parseInt(document.getElementById('adjustQty').value),
            reason: document.getElementById('adjustReason').value.trim()
        };
        if (!data.inventory_id || data.quantity === undefined || !data.reason) {
            document.getElementById('adjustResult').innerHTML = '<span style="color:var(--color-error);">Complete todos los campos (razon obligatoria)</span>';
            return;
        }
        apiFetch(API + '/adjustment', { method: 'POST', body: JSON.stringify(data) }).then(function (result) {
            document.getElementById('adjustResult').innerHTML = result && result.operation_id
                ? '<span style="color:var(--color-success);">Ajuste registrado (op #' + result.operation_id + ')</span>'
                : '<span style="color:var(--color-error);">' + (result ? result.error || 'Error' : 'Error de red') + '</span>';
        });
    }

    // =====================================================================
    //  TRANSFER / TRASPASO  (transferModal)
    // =====================================================================

    function showTransferModal() {
        document.getElementById('transferModal').classList.add('is-open');
    }
    function closeTransferModal() {
        document.getElementById('transferModal').classList.remove('is-open');
        document.getElementById('transferResult').innerHTML = '';
    }

    function recordTransfer() {
        var data = {
            inventory_id: parseInt(document.getElementById('transferItemId').value),
            from_branch_id: parseInt(document.getElementById('transferFrom').value),
            to_branch_id: parseInt(document.getElementById('transferTo').value),
            quantity: parseInt(document.getElementById('transferQty').value),
            notes: document.getElementById('transferNotes').value.trim()
        };
        if (!data.inventory_id || !data.from_branch_id || !data.to_branch_id || !data.quantity) {
            document.getElementById('transferResult').innerHTML = '<span style="color:var(--color-error);">Complete todos los campos</span>';
            return;
        }
        apiFetch(API + '/transfer', { method: 'POST', body: JSON.stringify(data) }).then(function (result) {
            document.getElementById('transferResult').innerHTML = result && result.out_operation_id
                ? '<span style="color:var(--color-success);">Transferencia registrada</span>'
                : '<span style="color:var(--color-error);">' + (result ? result.error || 'Error' : 'Error de red') + '</span>';
        });
    }

    // =====================================================================
    //  PHYSICAL COUNT / CONTEO  (countModal)
    // =====================================================================

    function showCountModal() {
        document.getElementById('countModal').classList.add('is-open');
        // Pre-add one line if empty
        if (!document.querySelectorAll('#countLines .count-row').length) {
            addCountLine();
        }
    }
    function closeCountModal() {
        document.getElementById('countModal').classList.remove('is-open');
    }

    function addCountLine() {
        var container = document.getElementById('countLines');
        var row = document.createElement('div');
        row.className = 'count-row';
        row.innerHTML =
            '<input type="number" placeholder="ID producto" class="count-inv-id" style="width:140px;" />' +
            '<input type="number" placeholder="Cantidad contada" class="count-qty" style="width:160px;" />' +
            '<button class="btn btn--ghost btn--sm" onclick="this.parentElement.remove()">Quitar</button>';
        container.appendChild(row);
    }

    function startPhysicalCount() {
        var rows = document.querySelectorAll('#countLines .count-row');
        var items = [];
        rows.forEach(function (row) {
            var invId = parseInt(row.querySelector('.count-inv-id').value);
            var qty = parseInt(row.querySelector('.count-qty').value);
            if (invId && !isNaN(qty)) items.push({ inventory_id: invId, counted_quantity: qty });
        });
        if (!items.length) { alert('Agregue al menos una linea'); return; }

        apiFetch(API + '/physical-count/start', { method: 'POST', body: JSON.stringify({ items: items }) }).then(function (result) {
            if (!result || !result.count_id) {
                document.getElementById('countResults').innerHTML = '<span style="color:var(--color-error);">' + (result ? result.error || 'Error' : 'Error de red') + '</span>';
                return;
            }

            draftCountId = result.count_id;
            var html = '<h4 style="margin-bottom:var(--space-3);">Borrador #' + result.count_id + ' — ' + esc(result.message) + '</h4>';
            html += '<table class="data-table"><thead><tr><th>ID</th><th>Esperado</th><th>Contado</th><th>Diferencia</th></tr></thead><tbody>';
            (result.results || []).forEach(function (r) {
                var color = r.difference === 0 ? 'var(--color-success)' : (r.difference < 0 ? 'var(--color-error)' : 'var(--color-warning)');
                html += '<tr><td>' + r.inventory_id + '</td><td>' + r.expected + '</td><td>' + r.counted + '</td><td style="color:' + color + ';font-weight:600;">' + (r.difference > 0 ? '+' : '') + r.difference + '</td></tr>';
            });
            html += '</tbody></table>';
            html += '<div style="margin-top:var(--space-3);display:flex;gap:var(--space-2);">';
            html += '<button class="btn btn--primary btn--sm" onclick="approvePhysicalCount()">Aprobar y aplicar ajustes</button>';
            html += '<button class="btn btn--ghost btn--sm" onclick="cancelDraft()">Cancelar borrador</button>';
            html += '</div>';
            document.getElementById('countResults').innerHTML = html;
        });
    }

    function approvePhysicalCount() {
        if (!draftCountId) { alert('No hay borrador activo'); return; }
        apiFetch(API + '/physical-count/approve', { method: 'POST', body: JSON.stringify({ count_id: draftCountId }) }).then(function (result) {
            if (result && result.status === 'approved') {
                document.getElementById('countResults').innerHTML = '<span style="color:var(--color-success);">' + esc(result.message) + '</span>';
                draftCountId = null;
            } else {
                document.getElementById('countResults').innerHTML += '<br><span style="color:var(--color-error);">' + (result ? result.error || 'Error' : 'Error de red') + '</span>';
            }
        });
    }

    function cancelDraft() {
        draftCountId = null;
        document.getElementById('countResults').innerHTML = '<span style="color:var(--color-text-muted);">Borrador cancelado</span>';
    }

    // =====================================================================
    //  ALERTS  (panel-alertas)
    // =====================================================================

    function loadAlerts() {
        apiFetch(API + '/alerts').then(function (data) {
            if (!data) return;
            var alerts = data.data || [];
            var container = document.getElementById('alertsContent');
            if (!container) return;

            if (!alerts.length) {
                container.innerHTML = '<p style="padding:var(--space-6);text-align:center;color:var(--color-text-muted);">Sin alertas activas</p>';
                return;
            }

            var html = '';

            // Group by severity
            var critical = alerts.filter(function (a) { return a.severity === 'critical'; });
            var warning = alerts.filter(function (a) { return a.severity === 'warning'; });
            var info = alerts.filter(function (a) { return a.severity !== 'critical' && a.severity !== 'warning'; });

            if (critical.length) {
                html += '<div class="section-heading"><span class="section-heading__title">Criticas</span><div class="section-heading__line"></div><span class="badge badge--low">' + critical.length + '</span></div>';
                html += '<div class="alerts-grid" style="margin-bottom:var(--space-6);">';
                critical.forEach(function (a) {
                    var icon = a.type === 'zero' ? 'AGOTADO' : (a.type === 'low' ? 'BAJO' : a.type.toUpperCase());
                    html += buildAlertCard(a, icon, 'critical');
                });
                html += '</div>';
            }

            if (warning.length) {
                html += '<div class="section-heading"><span class="section-heading__title">Advertencias</span><div class="section-heading__line"></div><span class="badge badge--over">' + warning.length + '</span></div>';
                html += '<div class="alerts-grid" style="margin-bottom:var(--space-6);">';
                warning.forEach(function (a) {
                    html += buildAlertCard(a, 'EXCESO', 'warning');
                });
                html += '</div>';
            }

            if (info.length) {
                html += '<div class="section-heading"><span class="section-heading__title">Informativas</span><div class="section-heading__line"></div><span class="badge badge--ok">' + info.length + '</span></div>';
                html += '<div class="alerts-grid" style="margin-bottom:var(--space-6);">';
                info.forEach(function (a) {
                    html += buildAlertCard(a, 'INFO', 'info');
                });
                html += '</div>';
            }

            container.innerHTML = html;
        });
    }

    function buildAlertCard(a, icon, level) {
        var cls = level === 'critical' ? 'alert-card--critical' : (level === 'warning' ? 'alert-card--warning' : 'alert-card--info');
        return '<div class="alert-card ' + cls + '">' +
            '<div class="alert-card__icon"><svg viewBox="0 0 24 24"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg></div>' +
            '<div class="alert-card__body">' +
            '<div class="alert-card__title">[' + icon + '] ' + esc(a.part_number) + ' — ' + esc(a.name) + '</div>' +
            '<div class="alert-card__desc">Stock: ' + a.stock +
            (a.min_stock ? ' (min: ' + a.min_stock + ')' : '') +
            (a.max_stock ? ' (max: ' + a.max_stock + ')' : '') +
            ' · Sucursal ' + a.branch_id + '</div>' +
            '</div></div>';
    }

    // =====================================================================
    //  HISTORY MODAL
    // =====================================================================

    function viewHistory(itemId) {
        apiFetch(API + '/items/' + itemId + '/history').then(function (data) {
            if (!data) return;
            var history = data.data || [];
            var html = '';
            if (!history.length) {
                html = '<p style="color:var(--color-text-muted);text-align:center;padding:var(--space-4);">Sin movimientos</p>';
            } else {
                html = '<table class="data-table"><thead><tr><th>Fecha</th><th>Tipo</th><th>Cantidad</th><th>Costo</th><th>Empleado</th><th>Notas</th></tr></thead><tbody>';
                history.forEach(function (h) {
                    var qtyColor = h.quantity > 0 ? 'var(--color-success)' : 'var(--color-error)';
                    html += '<tr>' +
                        '<td style="font-size:var(--text-caption);">' + esc(h.date) + '</td>' +
                        '<td>' + esc(h.type) + '</td>' +
                        '<td style="color:' + qtyColor + ';font-weight:600;">' + (h.quantity > 0 ? '+' : '') + h.quantity + '</td>' +
                        '<td class="td--amount">' + (h.cost ? '$' + fmt(h.cost) : '—') + '</td>' +
                        '<td>' + esc(h.employee) + '</td>' +
                        '<td style="font-size:var(--text-caption);">' + esc(h.notes) + '</td>' +
                        '</tr>';
                });
                html += '</tbody></table>';
            }
            document.getElementById('historyContent').innerHTML = html;
            document.getElementById('historyModal').classList.add('is-open');
        });
    }

    function closeHistoryModal() {
        document.getElementById('historyModal').classList.remove('is-open');
    }

    // =====================================================================
    //  BARCODE LABEL PRINT
    // =====================================================================

    function printBarcode(barcode, partNumber, name) {
        var w = window.open('', '_blank', 'width=400,height=250');
        w.document.write('<html><head><title>Etiqueta</title><style>body{font-family:monospace;text-align:center;padding:20px;}h1{font-size:1.5rem;margin:8px 0;}p{margin:4px 0;}</style></head><body>');
        w.document.write('<h1>' + barcode + '</h1>');
        w.document.write('<p>' + partNumber + '</p>');
        w.document.write('<p style="font-size:0.85rem;">' + name + '</p>');
        w.document.write('</body></html>');
        w.document.close();
        w.print();
    }

    // =====================================================================
    //  EXPOSE GLOBALS (for onclick handlers in HTML)
    // =====================================================================

    window._loadItems = function (p) { loadItems(p); };
    window.viewHistory = viewHistory;
    window.closeHistoryModal = closeHistoryModal;
    window.showCreateModal = showCreateModal;
    window.closeCreateModal = closeCreateModal;
    window.createItem = createItem;
    window.showPurchaseModal = showPurchaseModal;
    window.closePurchaseModal = closePurchaseModal;
    window.recordPurchase = recordPurchase;
    window.showAdjustmentModal = showAdjustmentModal;
    window.closeAdjustmentModal = closeAdjustmentModal;
    window.recordAdjustment = recordAdjustment;
    window.showTransferModal = showTransferModal;
    window.closeTransferModal = closeTransferModal;
    window.recordTransfer = recordTransfer;
    window.showCountModal = showCountModal;
    window.closeCountModal = closeCountModal;
    window.addCountLine = addCountLine;
    window.startPhysicalCount = startPhysicalCount;
    window.approvePhysicalCount = approvePhysicalCount;
    window.cancelDraft = cancelDraft;
    window.loadAlerts = loadAlerts;
    window.printBarcode = printBarcode;

    // =====================================================================
    //  INIT — load stock on page load
    // =====================================================================

    loadItems(1);
})();
