var StockValorizado = Object.assign({}, TablaGenerica);

StockValorizado._fmtMiles = function(val, dec) {
    dec = dec !== undefined ? dec : 2;
    var num = parseFloat(val) || 0;
    return num.toLocaleString('es-PE', { minimumFractionDigits: dec, maximumFractionDigits: dec });
};

var _svMostrarVista = StockValorizado.mostrarVista;
StockValorizado.mostrarVista = function() {
    var self = this;

    var _origCargar = this.cargarTabla;
    var skipFirst = true;
    this.cargarTabla = function() {
        if (skipFirst) { skipFirst = false; return Promise.resolve(); }
        return _origCargar.apply(this, arguments);
    };
    _svMostrarVista.call(this);
    this.cargarTabla = _origCargar;

    var wrap = document.getElementById(self.elementId + 'TablaWrap');
    if (!wrap) return;

    var oldBar = document.getElementById('svExtraBar');
    if (oldBar) oldBar.remove();

    var toolbar = document.querySelector('#' + self.elementId + ' .prov-toolbar');
    if (toolbar) {
        var bar = document.createElement('div');
        bar.id = 'svExtraBar';
        bar.style.cssText = 'display:flex;align-items:center;gap:10px;padding:8px 20px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-size:0.82rem';
        bar.innerHTML =
            '<label style="display:flex;align-items:center;gap:4px;cursor:pointer;font-weight:600;color:#475569;font-size:0.78rem">' +
            '<input type="checkbox" id="svSoloStock" checked style="margin-right:2px"> Solo con stock' +
            '</label>';
        toolbar.parentNode.insertBefore(bar, toolbar.nextSibling);

        document.getElementById('svSoloStock').addEventListener('change', function() {
            self.paginaActual = 1;
            self.cargarTabla();
        });
    }

    self.cargarTabla();
};

StockValorizado.obtenerParamsExtra = function() {
    var soloStock = document.getElementById('svSoloStock');
    var s = '';
    if (soloStock && soloStock.checked) {
        s += '&solo_con_stock=true';
    }
    return s;
};

StockValorizado._lastTotales = { total_articulos: 0, total_existencia: 0, total_valor: 0 };

var _svCargarTabla = StockValorizado.cargarTabla;
StockValorizado.cargarTabla = function() {
    var self = this;
    self._cargarTotales();
    var result = _svCargarTabla.call(self);
    if (result && typeof result.then === 'function') {
        result.then(function() { self._agregarSubtotales(); self._attatchRowEvents(); });
    }
};

StockValorizado._cargarTotales = function() {
    var self = this;
    self.ensureSesion();
    if (!self.sesion || !self.sesion.id_empresa) return;
    var url = self.API_URL + '/stock-valorizado/totales?id_empresa=' + self.sesion.id_empresa + (self.sesion && self.sesion.id_sucursal ? '&id_sucursal=' + self.sesion.id_sucursal : '');
    if (typeof self.obtenerParamsExtra === 'function') url += self.obtenerParamsExtra();
    fetch(url).then(function(r) { return r.json(); }).then(function(res) {
        if (res.ok) {
            self._lastTotales = { total_articulos: res.total_articulos || 0, total_existencia: res.total_existencia || 0, total_valor: res.total_valor || 0 };
        }
    }).catch(function() {});
};

StockValorizado._agregarSubtotales = function() {
    var self = this;
    var wrap = document.getElementById(self.elementId + 'TablaWrap');
    if (!wrap) return;

    wrap.querySelectorAll('.sv-subtotal-row, .sv-total-row').forEach(function(el) { el.remove(); });

    var tbody = wrap.querySelector('table tbody');
    if (!tbody) return;
    var trs = tbody.querySelectorAll('tr');
    if (trs.length === 0) return;

    var numCols = self.columns.length;
    var currentFamilia = '';
    var famExistencia = 0;
    var famValor = 0;
    var insertRows = [];

    self.currentData.forEach(function(row, idx) {
        var fam = row.nom_fam || 'SIN FAMILIA';
        var existencia = parseFloat(row.existencia) || 0;
        var costo = parseFloat(row.precio_unitario) || 0;
        var valor = existencia * costo;

        if (fam !== currentFamilia) {
            if (currentFamilia !== '' && famExistencia > 0) {
                insertRows.push({ afterIdx: idx - 1, fam: currentFamilia, existencia: famExistencia, valor: famValor });
            }
            currentFamilia = fam;
            famExistencia = 0;
            famValor = 0;
        }
        famExistencia = Math.round((famExistencia + existencia) * 100) / 100;
        famValor = Math.round((famValor + valor) * 100) / 100;
    });

    if (currentFamilia !== '' && famExistencia > 0) {
        insertRows.push({ afterIdx: self.currentData.length - 1, fam: currentFamilia, existencia: famExistencia, valor: famValor });
    }

    var totalExistencia = 0;
    var totalValor = 0;
    self.currentData.forEach(function(row) {
        var ex = parseFloat(row.existencia) || 0;
        var co = parseFloat(row.precio_unitario) || 0;
        totalExistencia = Math.round((totalExistencia + ex) * 100) / 100;
        totalValor = Math.round((totalValor + ex * co) * 100) / 100;
    });
    var totalArticulos = self.currentData.length;

    var subBg = 'background:#f1f5f9;border-top:2px solid #e2e8f0';
    var subTd = 'padding:5px 8px;font-weight:700;font-size:0.72rem;color:#1e293b';
    var subLabel = subTd + ';text-align:right;padding-right:6px;width:68%';
    var subExist = subTd + ';text-align:right;width:8%';
    var subUnd = subTd + ';text-align:center;width:5%';
    var subCosto = subTd + ';text-align:right;width:10%';
    var subValor = subTd + ';text-align:right;width:12%';

    for (var i = insertRows.length - 1; i >= 0; i--) {
        var vsr = insertRows[i];
        var refTr = trs[vsr.afterIdx];
        if (!refTr) continue;
        var subTr = document.createElement('tr');
        subTr.className = 'sv-subtotal-row';
        subTr.innerHTML =
            '<td colspan="4" style="' + subLabel + ';' + subBg + '">Subtotal ' + vsr.fam + '</td>' +
            '<td style="' + subExist + ';' + subBg + '">' + StockValorizado._fmtMiles(vsr.existencia) + '</td>' +
            '<td style="' + subUnd + ';' + subBg + '"></td>' +
            '<td style="' + subCosto + ';' + subBg + '"></td>' +
            '<td style="' + subValor + ';' + subBg + '">S/ ' + StockValorizado._fmtMiles(vsr.valor) + '</td>';
        refTr.parentNode.insertBefore(subTr, refTr.nextSibling);
    }

    var totBg = 'background:#1A4480;border:none';
    var totTd = 'padding:5px 8px;font-weight:700;font-size:0.75rem;color:#fff';
    var totLabel = totTd + ';text-align:right;padding-right:6px;width:68%';
    var totExist = totTd + ';text-align:right;width:8%';
    var totUnd = totTd + ';text-align:center;width:5%';
    var totCosto = totTd + ';text-align:right;width:10%';
    var totValor = totTd + ';text-align:right;width:12%';

    var lastTr = tbody.querySelector('tr:last-child');
    if (lastTr) {
        var totalTr = document.createElement('tr');
        totalTr.className = 'sv-total-row';
        totalTr.innerHTML =
            '<td colspan="4" style="' + totLabel + ';' + totBg + '">TOTAL GENERAL</td>' +
            '<td style="' + totExist + ';' + totBg + '">' + StockValorizado._fmtMiles(totalExistencia) + '</td>' +
            '<td style="' + totUnd + ';' + totBg + '"></td>' +
            '<td style="' + totCosto + ';' + totBg + '"></td>' +
            '<td style="' + totValor + ';' + totBg + '">S/ ' + StockValorizado._fmtMiles(totalValor) + '</td>';
        lastTr.parentNode.insertBefore(totalTr, lastTr.nextSibling);
    }

    var oldResumen = document.getElementById('svResumen');
    if (oldResumen) oldResumen.remove();

    var pag = document.getElementById(self.elementId + 'Paginacion');
    if (pag) {
        var resumen = document.createElement('div');
        resumen.id = 'svResumen';
        resumen.className = 'sv-resumen';
        resumen.innerHTML =
            '<div class="sv-resumen-item"><span class="sv-resumen-label">Articulos:</span> <span class="sv-resumen-value">' + StockValorizado._fmtMiles(totalArticulos) + '</span></div>' +
            '<div class="sv-resumen-item"><span class="sv-resumen-label">Total Existencia:</span> <span class="sv-resumen-value">' + StockValorizado._fmtMiles(totalExistencia) + '</span></div>' +
            '<div class="sv-resumen-item"><span class="sv-resumen-label">Total Valorizado:</span> <span class="sv-resumen-value" style="color:#1A4480">S/ ' + StockValorizado._fmtMiles(totalValor) + '</span></div>';
        pag.parentNode.insertBefore(resumen, pag);
    }
};

StockValorizado.imprimir = async function() {
    var self = this;
    var di = await TablaGenerica._obtenerDatosImpresion();
    var ahora = new Date();
    var fechaStr = ahora.toLocaleDateString('es-PE', { day: '2-digit', month: '2-digit', year: 'numeric' }) + ' ' + ahora.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });

    var filtros = [];
    if (Object.keys(self.filtrosColumna).length > 0) {
        var colMap = {};
        self.columns.forEach(function(c) { colMap[c.field] = c.label; });
        for (var k in self.filtrosColumna) { filtros.push((colMap[k] || k) + ': ' + self.filtrosColumna[k]); }
    }
    var buscarVal = document.getElementById(self.elementId + 'Buscar');
    if (buscarVal && buscarVal.value.trim()) filtros.push('Busqueda: ' + buscarVal.value.trim());

    var datos = await self.obtenerTodosDatos();
    if (!datos || datos.length === 0) { Mensaje.error({ titulo: 'Imprimir', texto: 'No hay datos' }); return; }

    var html = '<!DOCTYPE html><html><head><meta charset="UTF-8"><style>';
    html += '*{margin:0;padding:0;border:0;outline:none}';
    html += 'body{font-family:Arial,sans-serif;font-size:11px;margin:20px;color:#1E293B}';
    html += 'table{width:100%;border-collapse:separate;border-spacing:0;font-size:10px;margin-top:0}';
    html += 'thead{display:table-header-group}';
    html += 'tr{page-break-inside:avoid}';
    html += 'th{background:#1A4480;color:#fff;padding:8px 10px;text-align:center;font-weight:700;text-transform:uppercase;font-size:9px;border:0 !important;border-left:0 !important;border-right:0 !important;white-space:nowrap}';
    html += 'th.title-row{background:#fff;color:#1E293B;font-size:14px;padding:18px 12px 20px 12px;text-align:left}';
    html += 'th.filtros-row{background:#fff;color:#475569;font-size:9px;text-transform:none;padding:8px 12px 16px 12px;border-bottom:0;text-align:left}';
    html += 'td{padding:6px 10px;border:0;border-left:0;border-right:0;border-bottom:1px solid #E2E8F0;color:#334155;box-sizing:border-box}';
    html += 'tr:nth-child(even){background:#F8FAFC}';
    html += '.right{text-align:right}.center{text-align:center}.bold{font-weight:700}';
    html += '.subtotal{background:#F1F5F9;font-weight:700}.subtotal td{border-top:2px solid #E2E8F0;padding:6px 10px}';
    html += '@page{margin:12mm;@bottom-center{content:counter(page);font-size:9px;color:#94A3B8}}';
    html += '</style></head><body>';
    html += '<div style="border-radius:8px;overflow:hidden">';
    html += '<table>';
    html += '<thead>';
    html += '<tr><th class="title-row" colspan="8"><div style="display:flex;justify-content:space-between;align-items:flex-start"><div>' + di.logoHtml + '<span style="display:inline-block;vertical-align:middle"><span style="font-weight:800;color:#1A4480;text-transform:uppercase">Stock Valorizado Actual</span>' + (di.empresa ? '<br><span style="font-size:0.8rem;color:#1A4480;font-weight:600">' + di.empresa + '</span>' : '') + (di.sucursal ? '<br><span style="font-size:0.7rem;color:#64748B;font-weight:400">' + di.sucursal + '</span>' : '') + '</span></div><div style="text-align:right"><span style="font-size:0.65rem;color:#64748B;font-weight:400;text-transform:none">' + fechaStr + '</span></div></div></th></tr>';
        if (filtros.length > 0) html += '<tr><th class="filtros-row" colspan="8"><span style="padding:4px 8px">' + filtros.join(' | ') + '</span></th></tr>';
        html += '<tr style="clip-path:inset(0 round 6px 6px 0 0)"><th style="width:8%">Codigo</th><th style="width:8%">Cod.Venta</th><th style="width:22%">Articulo</th><th style="width:14%">Familia</th><th style="width:8%">Existencia</th><th style="width:5%">Und</th><th style="width:10%">Costo Unit.</th><th style="width:15%">Valor Total S/.</th></tr>';
        html += '</thead><tbody>';

        var cFam = '', fE = 0, fV = 0, tE = 0, tVc = 0;
        datos.forEach(function(art) {
            var fam = art.nom_fam || 'SIN FAMILIA';
            var ex = parseFloat(art.existencia) || 0;
            var co = parseFloat(art.precio_unitario) || 0;
            var va = Math.round(ex * co * 100) / 100;
            if (fam !== cFam) {
                if (cFam !== '' && fE > 0) {
                    var fVc = Math.round(fV * 100);
                    tVc += fVc;
                    html += '<tr class="subtotal"><td colspan="4" class="right">Subtotal ' + cFam + '</td><td class="right bold">' + StockValorizado._fmtMiles(fE) + '</td><td></td><td></td><td class="right bold">S/ ' + StockValorizado._fmtMiles(fV) + '</td></tr>';
                }
                cFam = fam; fE = 0; fV = 0;
            }
            fE = Math.round((fE + ex) * 100) / 100; fV += va;
            fV = Math.round(fV * 100) / 100;
            tE = Math.round((tE + ex) * 100) / 100;
            html += '<tr><td>' + (art.cod_articulo || '') + '</td><td>' + (art.cod_vta || '') + '</td><td>' + (art.nom_art || '') + '</td><td>' + (art.nom_fam || '') + '</td><td class="right">' + StockValorizado._fmtMiles(ex) + '</td><td class="center">' + (art.abe_uni || '') + '</td><td class="right">S/ ' + StockValorizado._fmtMiles(co, 4) + '</td><td class="right bold">S/ ' + StockValorizado._fmtMiles(va) + '</td></tr>';
        });
        if (cFam !== '' && fE > 0) {
            var fVc = Math.round(fV * 100);
            tVc += fVc;
            html += '<tr class="subtotal"><td colspan="4" class="right">Subtotal ' + cFam + '</td><td class="right bold">' + StockValorizado._fmtMiles(fE) + '</td><td></td><td></td><td class="right bold">S/ ' + StockValorizado._fmtMiles(fV) + '</td></tr>';
        }
        var tV = tVc / 100;

        var tA = datos.length;
        html += '</tbody></table>';
        html += '<table style="width:100%;border-collapse:separate;border-spacing:0;background:#1A4480;border-radius:0 0 6px 6px;overflow:hidden">';
        html += '<tr>';
        html += '<td style="width:8%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px"></td>';
        html += '<td style="width:8%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px"></td>';
        html += '<td style="width:22%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px"></td>';
        html += '<td style="width:14%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px;text-align:right">TOTAL GENERAL</td>';
        html += '<td style="width:8%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px;text-align:right">' + StockValorizado._fmtMiles(tE) + '</td>';
        html += '<td style="width:5%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px"></td>';
        html += '<td style="width:10%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px"></td>';
        html += '<td style="width:15%;padding:8px 10px;color:#fff;font-weight:700;font-size:11px;text-align:right">S/ ' + StockValorizado._fmtMiles(tV) + '</td>';
        html += '</tr></table></div>';
        html += '<div style="display:flex;gap:16px;margin-top:14px;padding:8px 12px;background:#F8FAFC;border-radius:6px;font-size:9px;flex-wrap:wrap;border:1px solid #E2E8F0">';
        html += '<span style="font-weight:700;color:#334155">Artículos: <span style="color:#1A4480">' + StockValorizado._fmtMiles(tA) + '</span></span>';
        html += '<span style="font-weight:700;color:#334155">Total Existencia: <span style="color:#1A4480">' + StockValorizado._fmtMiles(tE) + '</span></span>';
        html += '<span style="font-weight:700;color:#334155">Total Valorizado: <span style="color:#1A4480">S/ ' + StockValorizado._fmtMiles(tV) + '</span></span>';
        html += '<span style="font-weight:700;color:#334155;margin-left:auto">Total: <span style="color:#1A4480">' + StockValorizado._fmtMiles(datos.length) + ' registro(s)</span></span>';
        html += '</div>';
        html += '</body></html>';

        var iframe = document.createElement('iframe');
        iframe.style.cssText = 'position:fixed;top:-9999px;width:1px;height:1px';
        document.body.appendChild(iframe);
        var win = iframe.contentWindow;
        win.document.open();
        win.document.write(html);
        win.document.close();
    setTimeout(function() { win.print(); }, 300);
    setTimeout(function() { document.body.removeChild(iframe); }, 1500);
};

StockValorizado.exportarExcel = function() {
    var self = this;
    self.cerrarExportDD();
    self.obtenerTodosDatos().then(function(datos) {
        if (!datos || datos.length === 0) { Mensaje.error({ titulo: 'Excel', texto: 'No hay datos para exportar' }); return; }
        function go() {
            var wb = new ExcelJS.Workbook();
            var ws = wb.addWorksheet('Stock Valorizado');
            ws.columns = [
                { header: 'Codigo', key: 'cod', width: 10 }, { header: 'Cod. Venta', key: 'codvta', width: 12 },
                { header: 'Articulo', key: 'nombre', width: 35 }, { header: 'Familia', key: 'familia', width: 18 },
                { header: 'Existencia', key: 'existencia', width: 12 },
                { header: 'Und', key: 'und', width: 8 }, { header: 'Costo Unit.', key: 'costo', width: 14 },
                { header: 'Valor Total S/.', key: 'valor', width: 16 }
            ];
            ws.getRow(1).font = { bold: true, color: { argb: 'FFFFFFFF' } };
            ws.getRow(1).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF1A4480' } };
            ws.getRow(1).alignment = { horizontal: 'center' };
            var tE = 0, tV = 0;
            datos.forEach(function(art) {
                var ex = parseFloat(art.existencia) || 0, co = parseFloat(art.precio_unitario) || 0, va = ex * co;
                tE = Math.round((tE + ex) * 100) / 100; tV = Math.round((tV + va) * 100) / 100;
                ws.addRow({ cod: art.cod_articulo || '', codvta: art.cod_vta || '', nombre: art.nom_art || '', familia: art.nom_fam || '', existencia: ex, und: art.abe_uni || '', costo: co, valor: va });
            });
            ws.addRow([]);
            ws.addRow(['', '', '', '', 'TOTAL', tE, '', '', tV]).font = { bold: true };
            ws.getColumn('existencia').numFmt = '#,##0.00';
            ws.getColumn('costo').numFmt = '#,##0.0000';
            ws.getColumn('valor').numFmt = '#,##0.00';
            wb.xlsx.writeBuffer().then(function(buf) {
                var a = document.createElement('a');
                a.href = URL.createObjectURL(new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }));
                a.download = 'stock_valorizado_' + new Date().toISOString().slice(0, 10) + '.xlsx';
                a.click();
            });
        }
        if (typeof ExcelJS === 'undefined') { var s = document.createElement('script'); s.src = 'https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js'; s.onload = go; document.head.appendChild(s); } else { go(); }
    });
};

StockValorizado.exportarCSV = function() {
    var self = this;
    self.cerrarExportDD();
    self.obtenerTodosDatos().then(function(datos) {
        if (!datos || datos.length === 0) { Mensaje.error({ titulo: 'CSV', texto: 'No hay datos para exportar' }); return; }
        var bom = '\uFEFF', rows = [];
        rows.push(['Codigo', 'Cod.Venta', 'Articulo', 'Familia', 'Existencia', 'Und', 'Costo Unitario', 'Valor Total'].join(';'));
        datos.forEach(function(art) {
            var ex = parseFloat(art.existencia) || 0, co = parseFloat(art.precio_unitario) || 0, va = ex * co;
            rows.push(['"'+(art.cod_articulo||'')+'"','"'+(art.cod_vta||'')+'"','"'+(art.nom_art||'').replace(/"/g,'""')+'"','"'+(art.nom_fam||'').replace(/"/g,'""')+'"',ex.toFixed(2).replace('.',','),'"'+(art.abe_uni||'')+'"',co.toFixed(4).replace('.',','),va.toFixed(2).replace('.',',')].join(';'));
        });
        var a = document.createElement('a');
        a.href = URL.createObjectURL(new Blob([bom + rows.join('\n')], { type: 'text/csv;charset=utf-8' }));
        a.download = 'stock_valorizado_' + new Date().toISOString().slice(0, 10) + '.csv';
        a.click();
    });
};

StockValorizado.exportarPDF = function() { this.cerrarExportDD(); this.imprimir(); };

StockValorizado.exportarTXT = function() {
    var self = this;
    self.cerrarExportDD();
    self.obtenerTodosDatos().then(function(datos) {
        if (!datos || datos.length === 0) { Mensaje.error({ titulo: 'TXT', texto: 'No hay datos para exportar' }); return; }
        var rows = [];
        rows.push(['Codigo', 'Cod.Venta', 'Articulo', 'Familia', 'Existencia', 'Und', 'Costo Unitario', 'Valor Total'].join('\t'));
        datos.forEach(function(art) {
            var ex = parseFloat(art.existencia) || 0, co = parseFloat(art.precio_unitario) || 0, va = ex * co;
            rows.push([art.cod_articulo||'',art.cod_vta||'',art.nom_art||'',art.nom_fam||'',ex.toFixed(2),art.abe_uni||'',co.toFixed(4),va.toFixed(2)].join('\t'));
        });
        var a = document.createElement('a');
        a.href = URL.createObjectURL(new Blob([rows.join('\n')], { type: 'text/plain;charset=utf-8' }));
        a.download = 'stock_valorizado_' + new Date().toISOString().slice(0, 10) + '.txt';
        a.click();
    });
};

StockValorizado._attatchRowEvents = function() {
    var self = this;
    var wrap = document.getElementById(self.elementId + 'TablaWrap');
    if (!wrap || !self.currentData || self.currentData.length === 0) return;
    var rows = wrap.querySelectorAll('table tbody tr:not(.sv-subtotal-row):not(.sv-total-row)');
    rows.forEach(function(tr, idx) {
        var rowData = self.currentData[idx];
        if (!rowData) return;
        tr.style.cursor = 'pointer';
        tr.addEventListener('dblclick', function(e) {
            if (e.target.closest('.prov-btn-accion, .prov-btn-eliminar, .prov-btn-filtro')) return;
            self._verDetalleArticulo(rowData);
        });
    });
};

StockValorizado._verDetalleArticulo = function(row) {
    var self = this;
    self.ensureSesion();
    if (!row.id_articulo || !self.sesion) return;
    fetch(self.API_URL + '/articulos/' + row.id_articulo + '?id_empresa=' + self.sesion.id_empresa)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (!res.ok) { Mensaje.error({ titulo: 'Error', texto: 'Artículo no encontrado' }); return; }
            var a = res.data;
            var html = '<div style="padding:4px 0"><div style="display:grid;grid-template-columns:auto 1fr;gap:4px 16px;font-size:0.82rem">';
            html += '<span style="font-weight:600;color:#475569">Código:</span><span>' + (a.cod_articulo || '-') + '</span>';
            html += '<span style="font-weight:600;color:#475569">Cód. Venta:</span><span>' + (a.cod_vta || '-') + '</span>';
            html += '<span style="font-weight:600;color:#475569">Nombre:</span><span>' + (a.nombre || '-') + '</span>';
            html += '<span style="font-weight:600;color:#475569">Familia:</span><span>' + (a.familia_nombre || '-') + '</span>';
            html += '<span style="font-weight:600;color:#475569">Subfamilia:</span><span>' + (a.subfamilia_nombre || '-') + '</span>';
            html += '<span style="font-weight:600;color:#475569">Unidad:</span><span>' + (a.unidad_nombre || '-') + ' (' + (a.unidad_codigo || '') + ')</span>';
            html += '<span style="font-weight:600;color:#475569">Proveedor:</span><span>' + (a.proveedor_razon_social || '-') + '</span>';
            html += '<span style="font-weight:600;color:#475569">Stock Actual:</span><span style="font-weight:700">' + StockValorizado._fmtMiles(a.stock_actual) + '</span>';
            html += '<span style="font-weight:600;color:#475569">Stock Mínimo:</span><span>' + StockValorizado._fmtMiles(a.stock_minimo) + '</span>';
            html += '<span style="font-weight:600;color:#475569">Stock Máximo:</span><span>' + StockValorizado._fmtMiles(a.stock_maximo) + '</span>';
            html += '<span style="font-weight:600;color:#475569">Precio Venta:</span><span>S/ ' + StockValorizado._fmtMiles(a.precio_venta) + '</span>';
            html += '<span style="font-weight:600;color:#475569">Precio Compra:</span><span>S/ ' + StockValorizado._fmtMiles(a.precio_compra) + '</span>';
            html += '</div></div>';
            Modal.abrir({ titulo: 'Detalle de Artículo — ' + (a.cod_articulo || ''), ancho: '600px', contenido: html, botones: [{ texto: 'Cerrar', tipo: 'primario', accion: function() { Modal.cerrar(); } }] });
        }).catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error al cargar artículo' }); });
};

StockValorizado.init({
    title: 'Stock Valorizado',
    icon: 'fa-boxes-stacked',
    idSingular: 'Stock',
    idField: 'cod_articulo',
    endpoint: '/stock-valorizado',
    sortDefault: 'nom_fam',
    limite: 50,
    searchPlaceholder: 'Buscar por codigo, nombre...',
    filtroEstado: false,
    showEstado: false,
    showAcciones: false,
    showCrear: false,
    exportFileName: 'StockValorizado',
    elementId: 'pageStockValorizado',
    menuPage: 'StockValorizado',
    columnFilters: {},
    columns: [
        { field: 'cod_articulo', label: 'Codigo', sortable: true, filterable: true, width: '6%',
            render: function(row) { return '<span style="font-family:monospace;font-size:0.78rem">' + (row.cod_articulo || '') + '</span>'; }
        },
        { field: 'cod_vta', label: 'Cod. Venta', sortable: true, filterable: true, width: '7%',
            render: function(row) { return '<span style="font-family:monospace;font-size:0.78rem">' + (row.cod_vta || '') + '</span>'; }
        },
        { field: 'nom_art', label: 'Articulo', sortable: true, filterable: true, width: '20%' },
        { field: 'nom_fam', label: 'Familia', sortable: true, filterable: true, width: '14%',
            render: function(row) { return '<span style="color:#64748b">' + (row.nom_fam || '') + '</span>'; }
        },
        { field: 'existencia', label: 'Existencia', sortable: true, filterable: false, width: '8%',
            render: function(row) {
                var val = parseFloat(row.existencia) || 0;
                return '<span style="display:block;text-align:right;font-weight:600">' + StockValorizado._fmtMiles(val) + '</span>';
            }
        },
        { field: 'abe_uni', label: 'Und', sortable: false, filterable: false, width: '5%',
            render: function(row) { return '<span style="text-align:center;display:block">' + (row.abe_uni || '') + '</span>'; }
        },
        { field: 'precio_unitario', label: 'Costo Unit.', sortable: true, filterable: false, width: '10%',
            render: function(row) {
                var val = parseFloat(row.precio_unitario) || 0;
                return '<span style="display:block;text-align:right">S/ ' + StockValorizado._fmtMiles(val, 4) + '</span>';
            }
        },
        { field: 'valor_total', label: 'Valor Total S/.', sortable: true, filterable: false, width: '12%',
            render: function(row) {
                var existencia = parseFloat(row.existencia) || 0;
                var costo = parseFloat(row.precio_unitario) || 0;
                var valor = existencia * costo;
                return '<span style="display:block;text-align:right;font-weight:700">S/ ' + StockValorizado._fmtMiles(valor) + '</span>';
            }
        }
    ],
    onEliminar: null
});
