// ══════════════════════════════════════════════
// RRB Admin — Module: inventario
// ══════════════════════════════════════════════

function invInit() {
  invPoblarMeses('inv-mov-mes');
  invPoblarMeses('inv-desp-mes');
  const hoy   = new Date();
  const desde = hoy.getFullYear() + '-' + String(hoy.getMonth()+1).padStart(2,'0') + '-01';
  const hasta = hoy.getFullYear() + '-' + String(hoy.getMonth()+1).padStart(2,'0') + '-' + String(hoy.getDate()).padStart(2,'0');
  document.getElementById('inv-mov-desde').value  = desde;
  document.getElementById('inv-mov-hasta').value  = hasta;
  document.getElementById('inv-desp-desde').value = desde;
  document.getElementById('inv-desp-hasta').value = hasta;
  invCargarStock();
}

function invPoblarMeses(selectId) {
  const sel = document.getElementById(selectId);
  if (!sel) return;
  sel.innerHTML = '';
  const hoy = new Date();
  const meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
  for (let i = 0; i < 24; i++) {
    const d = new Date(hoy.getFullYear(), hoy.getMonth() - i, 1);
    const val = d.getFullYear() + '-' + String(d.getMonth()+1).padStart(2,'0');
    const opt = document.createElement('option');
    opt.value = val;
    opt.textContent = meses[d.getMonth()] + ' ' + d.getFullYear();
    if (i === 0) opt.selected = true;
    sel.appendChild(opt);
  }
}

function invMovSelMes() {
  const val = document.getElementById('inv-mov-mes').value;
  const [y, m] = val.split('-').map(Number);
  const ultimo = new Date(y, m, 0).getDate();
  document.getElementById('inv-mov-desde').value = `${y}-${String(m).padStart(2,'0')}-01`;
  document.getElementById('inv-mov-hasta').value = `${y}-${String(m).padStart(2,'0')}-${String(ultimo).padStart(2,'0')}`;
}

function invDespSelMes() {
  const val = document.getElementById('inv-desp-mes').value;
  const [y, m] = val.split('-').map(Number);
  const ultimo = new Date(y, m, 0).getDate();
  document.getElementById('inv-desp-desde').value = `${y}-${String(m).padStart(2,'0')}-01`;
  document.getElementById('inv-desp-hasta').value = `${y}-${String(m).padStart(2,'0')}-${String(ultimo).padStart(2,'0')}`;
}

// ── Cambio de tab principal ────────────────────────────────────
function invTab(tab) {
  _invCurrentTab = tab;
  document.querySelectorAll('.inv-tab').forEach(b => b.classList.remove('active'));
  document.querySelectorAll('.inv-view').forEach(v => v.style.display = 'none');
  document.getElementById('inv-tab-' + tab)?.classList.add('active');
  document.getElementById('inv-view-' + tab).style.display = 'block';
}

  // ── Sub-tab desplazamientos ────────────────────────────
function invDespSubTab(sub) {
  _invDespSubTab = sub;
  ['prod','cent','matriz'].forEach(s => {
    document.getElementById('inv-desp-tab-' + s)?.classList.toggle('active', s === sub);
    const v = document.getElementById('inv-desp-view-' + s);
    if (v) v.style.display = s === sub ? 'block' : 'none';
  });
  if (sub === 'matriz' && _invDespData) invDespRenderMatriz(_invDespData);
}

// ── Gráfica comparativa ───────────────────────────────
let _invDespChartInst = null;
let _invDespChartMode = 'unidades';

function invDespChartVista(modo) {
  _invDespChartMode = modo;
  document.getElementById('inv-desp-chart-uni').classList.toggle('active', modo === 'unidades');
  document.getElementById('inv-desp-chart-mxn').classList.toggle('active', modo === 'mxn');
  if (_invDespData) invDespRenderChart(_invDespData.comparativa);
}

function invDespRenderChart(comparativa) {
  if (!comparativa || comparativa.length === 0) return;
  const labels = comparativa.map(m => m.mes);
  const values = comparativa.map(m => _invDespChartMode === 'unidades' ? m.unidades : m.monto_mxn);
  const ctx = document.getElementById('inv-desp-chart').getContext('2d');
  if (_invDespChartInst) _invDespChartInst.destroy();
  _invDespChartInst = new Chart(ctx, {
    type: 'bar',
    data: {
      labels,
      datasets: [{
        label: _invDespChartMode === 'unidades' ? 'Unidades' : 'Monto MXN',
        data: values,
        backgroundColor: values.map((_, i) => i === values.length - 1 ? 'rgba(26,58,92,0.9)' : 'rgba(232,160,32,0.75)'),
        borderRadius: 6,
      }]
    },
    options: {
      responsive: true,
      plugins: {
        legend: { display: false },
        tooltip: {
          callbacks: {
            label: ctx => _invDespChartMode === 'mxn'
              ? '$' + ctx.parsed.y.toLocaleString('es-MX', {minimumFractionDigits:2})
              : ctx.parsed.y.toLocaleString('es-MX') + ' uds'
          }
        }
      },
      scales: {
        y: {
          beginAtZero: true,
          ticks: {
            callback: v => _invDespChartMode === 'mxn'
              ? '$' + (v/1000).toFixed(0) + 'k'
              : v.toLocaleString('es-MX')
          }
        }
      }
    }
  });
}

// ── Vista matricial producto × centro ──────────────────────
function invDespRenderMatriz(data) {
  const wrap = document.getElementById('inv-desp-matriz-wrap');
  if (!data.por_producto || data.por_producto.length === 0) {
    wrap.innerHTML = '<p style="text-align:center;padding:20px;color:#888">Sin datos</p>';
    return;
  }
  // Recopilar todos los centros presentes
  const centrosSet = {};
  data.por_producto.forEach(p => {
    p.por_centro.forEach(c => { centrosSet[c.idcd] = c.nombre; });
  });
  const centroIds = Object.keys(centrosSet).sort((a,b) => a-b);

  let html = '<div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;font-size:12px">';
  // Header
  html += '<thead><tr style="background:#f5f8fc">';
  html += '<th style="padding:8px 12px;text-align:left;font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;border-bottom:1px solid var(--border);white-space:nowrap">Producto</th>';
  html += '<th style="padding:8px 12px;text-align:center;font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;border-bottom:1px solid var(--border)">Total</th>';
  centroIds.forEach(id => {
    html += `<th style="padding:8px 12px;text-align:center;font-size:11px;font-weight:700;color:var(--muted);text-transform:uppercase;border-bottom:1px solid var(--border);white-space:nowrap">${id} - ${centrosSet[id]}</th>`;
  });
  html += '</tr></thead><tbody>';

  // Filas por producto
  data.por_producto.forEach((p, i) => {
    const bg = i % 2 === 0 ? '#fff' : '#f9fafb';
    const centroMap = {};
    p.por_centro.forEach(c => { centroMap[c.idcd] = c.unidades; });
    html += `<tr style="background:${bg}">`;
    html += `<td style="padding:8px 12px;font-weight:600;white-space:nowrap">${p.nombre}<br><span style="font-size:10px;color:#888;font-weight:400">${p.presentacion||''}</span></td>`;
    html += `<td style="padding:8px;text-align:center;font-weight:700;color:var(--primary)">${fmtNum(p.unidades)}</td>`;
    centroIds.forEach(id => {
      const v = centroMap[id] || 0;
      const color = v > 0 ? '#1a3a5c' : '#ccc';
      html += `<td style="padding:8px;text-align:center;color:${color}">${v > 0 ? fmtNum(v) : '—'}</td>`;
    });
    html += '</tr>';
  });

  // Fila de totales
  html += '<tr style="background:#1a3a5c;color:#fff;font-weight:700">';
  html += '<td style="padding:8px 12px">TOTAL</td>';
  html += `<td style="padding:8px;text-align:center">${fmtNum(data.totales.unidades)}</td>`;
  centroIds.forEach(id => {
    const tot = data.por_producto.reduce((s, p) => {
      const c = p.por_centro.find(c => String(c.idcd) === String(id));
      return s + (c ? c.unidades : 0);
    }, 0);
    html += `<td style="padding:8px;text-align:center">${tot > 0 ? fmtNum(tot) : '—'}</td>`;
  });
  html += '</tr>';

  html += '</tbody></table></div>';
  wrap.innerHTML = html;
}

// ══════════════════════════════════════════════════════════════
//  STOCK ACTUAL
// ══════════════════════════════════════════════════════════════
async function invCargarStock() {
  const centro = document.getElementById('inv-stock-centro').value;
  const tbody  = document.getElementById('inv-stock-tbody');
  tbody.innerHTML = '<tr><td colspan="20" style="text-align:center;padding:20px;color:#888">Cargando...</td></tr>';
  const token = localStorage.getItem('rrb_admin_token');
  try {
    const url = `api/inventario-stock.php?centro=${centro}`;
    const resp = await fetch(url, { headers: { Authorization: 'Bearer ' + token } });
    const data = await resp.json();
    if (!data.success) throw new Error(data.error || 'Error');
    _invStockData = data;

    // Poblar filtro de centros (solo primera vez)
    const selCentro = document.getElementById('inv-stock-centro');
    if (selCentro.options.length <= 1) {
      data.centros.forEach(c => {
        const o = document.createElement('option');
        o.value = c.idusuarios_ci;
        o.textContent = c.idusuarios_ci + ' - ' + c.nombre;
        selCentro.appendChild(o);
      });
      // Poblar también los otros filtros de centros
      ['inv-mov-centro','inv-aud-centro','inv-desp-centro'].forEach(id => {
        const sel = document.getElementById(id);
        if (!sel) return;
        const defaultOpt = sel.options[0];
        sel.innerHTML = '';
        sel.appendChild(defaultOpt);
        data.centros.forEach(c => {
          const o = document.createElement('option');
          o.value = c.idusuarios_ci;
          o.textContent = c.idusuarios_ci + ' - ' + c.nombre;
          sel.appendChild(o);
        });
        // Auto-select si es centro logueado
        if (esCentro()) { autoSelectCentro(id); }
      });
      // Auto-select centro principal de stock
      if (esCentro()) { autoSelectCentro('inv-stock-centro'); }
      // Poblar filtros de productos
      ['inv-mov-prod','inv-desp-prod'].forEach(id => {
        const sel = document.getElementById(id);
        if (!sel) return;
        sel.innerHTML = '<option value="0">Todos</option>';
        (data.centros || []);
      });
    }

    // KPIs
    document.getElementById('inv-stat-piezas').textContent    = fmtNum(data.stats.total_piezas);
    document.getElementById('inv-stat-negativos').textContent = data.stats.productos_negativos;
    document.getElementById('inv-stat-centros').textContent   = data.stats.centros_activos;

    // Construir encabezados dinámicos por centro
    const centrosConStock = data.resumen_centros;
    const thead = document.getElementById('inv-stock-thead');
    let thHtml = '<tr style="background:var(--primary);color:#fff">';
    thHtml += '<th style="padding:10px 12px;text-align:left;min-width:160px">Producto</th>';
    centrosConStock.forEach(c => {
      thHtml += `<th style="padding:10px 8px;text-align:center;min-width:80px;font-size:11px">${c.idcd} - ${c.nombre.substring(0,12)}</th>`;
    });
    thHtml += '<th style="padding:10px 12px;text-align:center;background:#1a3a5c">Total</th></tr>';
    thead.innerHTML = thHtml;

    // Filas de productos
    if (!data.stock || data.stock.length === 0) {
      tbody.innerHTML = '<tr><td colspan="20" style="text-align:center;padding:20px;color:#888">Sin datos de stock</td></tr>';
      return;
    }
    let html = '';
    data.stock.forEach((prod, i) => {
      const bg = prod.tiene_negativo ? '#fff3cd' : (i % 2 === 0 ? '#fff' : '#f9f9f9');
      html += `<tr style="background:${bg}">`;
      html += `<td style="padding:8px 12px;font-weight:600">${prod.nombre}<br><span style="font-size:11px;color:#888">${prod.presentacion || ''}</span></td>`;
      centrosConStock.forEach(c => {
        const cant = prod.centros[c.idcd] ?? 0;
        const color = cant < 0 ? '#dc3545' : (cant === 0 ? '#aaa' : 'inherit');
        html += `<td style="padding:8px;text-align:center;color:${color};font-weight:${cant < 0 ? '700' : '400'}">${fmtNum(cant)}</td>`;
      });
      const totalColor = prod.total < 0 ? '#dc3545' : 'inherit';
      html += `<td style="padding:8px 12px;text-align:center;font-weight:700;color:${totalColor}">${fmtNum(prod.total)}</td>`;
      html += '</tr>';
    });
    tbody.innerHTML = html;
  } catch(e) {
    tbody.innerHTML = `<tr><td colspan="20" style="text-align:center;padding:20px;color:#dc3545">Error: ${e.message}</td></tr>`;
  }
}

// ══════════════════════════════════════════════════════════════
//  MOVIMIENTOS (cambiostock)
// ══════════════════════════════════════════════════════════════
async function invCargarMovimientos() {
  const desde  = document.getElementById('inv-mov-desde').value;
  const hasta  = document.getElementById('inv-mov-hasta').value;
  const centro = document.getElementById('inv-mov-centro').value;
  const prod   = document.getElementById('inv-mov-prod').value;
  const tbody  = document.getElementById('inv-mov-tbody');
  tbody.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:20px;color:#888">Cargando...</td></tr>';
  const token = localStorage.getItem('rrb_admin_token');
  try {
    const url = `api/inventario-movimientos.php?desde=${desde}&hasta=${hasta}&centro=${centro}&prod=${prod}`;
    const resp = await fetch(url, { headers: { Authorization: 'Bearer ' + token } });
    const data = await resp.json();
    if (!data.success) throw new Error(data.error || 'Error');
    _invMovData = data;

    // Poblar productos si no están
    const selProd = document.getElementById('inv-mov-prod');
    if (selProd.options.length <= 1 && data.productos) {
      data.productos.forEach(p => {
        const o = document.createElement('option');
        o.value = p.id_prod;
        o.textContent = p.nombreProd;
        selProd.appendChild(o);
      });
      // También para desplazamientos
      const selProd2 = document.getElementById('inv-desp-prod');
      if (selProd2) {
        selProd2.innerHTML = '<option value="0">Todos</option>';
        data.productos.forEach(p => {
          const o = document.createElement('option');
          o.value = p.id_prod;
          o.textContent = p.nombreProd;
          selProd2.appendChild(o);
        });
      }
    }

    // KPIs
    document.getElementById('inv-mov-stat-reg').textContent  = fmtNum(data.totales.registros);
    document.getElementById('inv-mov-stat-ent').textContent  = fmtNum(data.totales.entradas);
    document.getElementById('inv-mov-stat-sal').textContent  = fmtNum(data.totales.salidas);
    const neto = data.totales.neto;
    const netoEl = document.getElementById('inv-mov-stat-neto');
    netoEl.textContent = (neto >= 0 ? '+' : '') + fmtNum(neto);
    netoEl.style.color = neto >= 0 ? '#155724' : '#721c24';

    document.getElementById('inv-mov-total-info').textContent = `${fmtNum(data.totales.registros)} movimientos encontrados`;

    if (!data.movimientos || data.movimientos.length === 0) {
      tbody.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:20px;color:#888">Sin movimientos en el período</td></tr>';
      return;
    }
    let html = '';
    data.movimientos.forEach((m, i) => {
      const bg = i % 2 === 0 ? '#fff' : '#f9f9f9';
      const movColor = m.cant_mov > 0 ? '#155724' : '#721c24';
      const movBg    = m.cant_mov > 0 ? '#d4edda' : '#f8d7da';
      html += `<tr style="background:${bg}">`;
      html += `<td style="padding:8px 12px">${m.fecha} ${m.hora || ''}</td>`;
      html += `<td style="padding:8px 12px">${m.idcd ?? m.centro} - ${m.nombre_centro || 'Centro ' + m.centro}</td>`;
      html += `<td style="padding:8px 12px">${m.nombre_prod1 || 'Prod ' + m.prod1}</td>`;
      html += `<td style="padding:8px;text-align:center"><span style="background:${movBg};color:${movColor};padding:2px 8px;border-radius:12px;font-weight:700;font-size:12px">${m.cant_mov > 0 ? '+' : ''}${fmtNum(m.cant_mov)}</span></td>`;
      html += `<td style="padding:8px;text-align:center;color:#721c24">${m.quitado > 0 ? '-' + fmtNum(m.quitado) : '—'}</td>`;
      html += `<td style="padding:8px;text-align:center;color:#155724">${m.agregado > 0 ? '+' + fmtNum(m.agregado) : '—'}</td>`;
      html += '</tr>';
    });
    tbody.innerHTML = html;
  } catch(e) {
    tbody.innerHTML = `<tr><td colspan="6" style="text-align:center;padding:20px;color:#dc3545">Error: ${e.message}</td></tr>`;
  }
}

// ══════════════════════════════════════════════════════════════
//  AUDITORÍA
// ══════════════════════════════════════════════════════════════
async function invCargarAuditoria() {
  const centro = document.getElementById('inv-aud-centro').value;
  const tbody  = document.getElementById('inv-aud-tbody');
  tbody.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:20px;color:#888">Calculando diferencias...</td></tr>';
  const token = localStorage.getItem('rrb_admin_token');
  try {
    const url = `api/inventario-auditoria.php?centro=${centro}`;
    const resp = await fetch(url, { headers: { Authorization: 'Bearer ' + token } });
    const data = await resp.json();
    if (!data.success) throw new Error(data.error || 'Error');
    _invAudData = data;

    document.getElementById('inv-aud-stat-total').textContent = data.stats.total_diferencias;
    document.getElementById('inv-aud-stat-falt').textContent  = data.stats.con_faltante;
    document.getElementById('inv-aud-stat-sobr').textContent  = data.stats.con_sobrante;

    if (!data.diferencias || data.diferencias.length === 0) {
      tbody.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:20px;color:#155724;font-weight:600">✅ Sin diferencias detectadas — el stock está consistente</td></tr>';
      return;
    }
    let html = '';
    data.diferencias.forEach((d, i) => {
      const bg   = i % 2 === 0 ? '#fff' : '#f9f9f9';
      const diff = d.diferencia;
      const diffColor = diff < 0 ? '#dc3545' : '#28a745';
      const diffLabel = diff < 0 ? `⬇ ${fmtNum(diff)}` : `⬆ +${fmtNum(diff)}`;
      html += `<tr style="background:${bg}">`;
      html += `<td style="padding:8px 12px">${d.idcd} - ${d.nombre_centro}</td>`;
      html += `<td style="padding:8px 12px;font-weight:600">${d.nombre_prod}</td>`;
      html += `<td style="padding:8px;text-align:center">${fmtNum(d.stock_real)}</td>`;
      html += `<td style="padding:8px;text-align:center">${fmtNum(d.stock_calc)}</td>`;
      html += `<td style="padding:8px;text-align:center;font-weight:700;color:${diffColor}">${diffLabel}</td>`;
      html += `<td style="padding:8px;text-align:center"><button onclick="invAjustarStock(${d.idcd},${d.idprod},'${d.nombre_prod}',${d.stock_calc})" style="padding:4px 10px;background:#6c757d;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:12px">Corregir</button></td>`;
      html += '</tr>';
    });
    tbody.innerHTML = html;
  } catch(e) {
    tbody.innerHTML = `<tr><td colspan="6" style="text-align:center;padding:20px;color:#dc3545">Error: ${e.message}</td></tr>`;
  }
}

async function invAjustarStock(idcd, idprod, nombreProd, stockCalc) {
  const nuevaCant = prompt(`Ajustar stock de "${nombreProd}" en centro ${idcd}\nStock calculado: ${stockCalc}\nNueva cantidad:`, stockCalc);
  if (nuevaCant === null) return;
  const motivo = prompt('Motivo del ajuste:', 'Corrección manual admin');
  if (motivo === null) return;
  const token = localStorage.getItem('rrb_admin_token');
  try {
    const resp = await fetch('api/inventario-auditoria.php', {
      method: 'POST',
      headers: { Authorization: 'Bearer ' + token, 'Content-Type': 'application/json' },
      body: JSON.stringify({ ajuste: { idcd, idprod, cantidad: parseInt(nuevaCant), motivo } })
    });
    const data = await resp.json();
    if (data.success) {
      alert('✅ Stock ajustado correctamente');
      invCargarAuditoria();
    } else {
      alert('Error: ' + (data.error || 'Desconocido'));
    }
  } catch(e) {
    alert('Error: ' + e.message);
  }
}

// ══════════════════════════════════════════════════════════════
//  DESPLAZAMIENTOS
// ══════════════════════════════════════════════════════════════
async function invCargarDesplazamientos() {
  const desde  = document.getElementById('inv-desp-desde').value;
  const hasta  = document.getElementById('inv-desp-hasta').value;
  const centro = document.getElementById('inv-desp-centro').value;
  const prod   = document.getElementById('inv-desp-prod').value;
  const tbodyP = document.getElementById('inv-desp-tbody-prod');
  const tbodyC = document.getElementById('inv-desp-tbody-cent');
  tbodyP.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:20px;color:#888">Cargando...</td></tr>';
  tbodyC.innerHTML = '<tr><td colspan="5" style="text-align:center;padding:20px;color:#888">Cargando...</td></tr>';
  const token = localStorage.getItem('rrb_admin_token');
  try {
    const url = `api/inventario-desplazamientos.php?desde=${desde}&hasta=${hasta}&centro=${centro}&prod=${prod}`;
    const resp = await fetch(url, { headers: { Authorization: 'Bearer ' + token } });
    const data = await resp.json();
    if (!data.success) throw new Error(data.error || 'Error');
    _invDespData = data;

    // KPIs
    document.getElementById('inv-desp-stat-uni').textContent   = fmtNum(data.totales.unidades);
    document.getElementById('inv-desp-stat-notas').textContent = fmtNum(data.totales.notas);
    document.getElementById('inv-desp-stat-mxn').textContent   = fmtMxn(data.totales.monto_mxn);
    document.getElementById('inv-desp-stat-pts').textContent   = fmtNum(data.totales.puntos || 0);

    // Gráfica comparativa 6 meses
    invDespRenderChart(data.comparativa);

    // Tabla por producto
    if (!data.por_producto || data.por_producto.length === 0) {
      tbodyP.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:20px;color:#888">Sin ventas en el período</td></tr>';
    } else {
      let html = '';
      data.por_producto.forEach((p, i) => {
        const bg = i % 2 === 0 ? '#fff' : '#f9f9f9';
        const centrosStr = p.por_centro.map(c => `${c.nombre}: ${fmtNum(c.unidades)}`).join(' | ');
        html += `<tr style="background:${bg}">`;
        html += `<td style="padding:8px 12px;font-weight:600">${p.nombre}<br><span style="font-size:11px;color:#888">${p.presentacion || ''}</span></td>`;
        html += `<td style="padding:8px;text-align:center;font-weight:700;color:var(--primary)">${fmtNum(p.unidades)}</td>`;
        html += `<td style="padding:8px;text-align:center">${fmtNum(p.notas)}</td>`;
        html += `<td style="padding:8px;text-align:right">${fmtMxn(p.monto_mxn)}</td>`;
        html += `<td style="padding:8px;text-align:center;color:#28a745">${fmtNum(p.puntos)}</td>`;
        html += `<td style="padding:8px 12px;font-size:11px;color:#555">${centrosStr}</td>`;
        html += '</tr>';
      });
      tbodyP.innerHTML = html;
    }

    // Tabla por centro
    if (!data.por_centro || data.por_centro.length === 0) {
      tbodyC.innerHTML = '<tr><td colspan="6" style="text-align:center;padding:20px;color:#888">Sin ventas en el período</td></tr>';
    } else {
      let html = '';
      data.por_centro.forEach((c, i) => {
        const bg = i % 2 === 0 ? '#fff' : '#f9f9f9';
        const topProds = c.productos.slice(0,5).map(p => `${p.nombre}: ${fmtNum(p.unidades)}`).join(' | ');
        html += `<tr style="background:${bg}">`;
        html += `<td style="padding:8px 12px;font-weight:600">${c.idcd} - ${c.nombre}</td>`;
        html += `<td style="padding:8px;text-align:center;font-weight:700;color:var(--primary)">${fmtNum(c.unidades)}</td>`;
        html += `<td style="padding:8px;text-align:center">${fmtNum(c.notas)}</td>`;
        html += `<td style="padding:8px;text-align:right">${fmtMxn(c.monto_mxn)}</td>`;
        html += `<td style="padding:8px;text-align:center;color:#28a745">${fmtNum(c.puntos || 0)}</td>`;
        html += `<td style="padding:8px 12px;font-size:11px;color:#555">${topProds}</td>`;
        html += '</tr>';
      });
      tbodyC.innerHTML = html;
    }

    // Si la vista activa es matriz, renderizarla también
    if (_invDespSubTab === 'matriz') invDespRenderMatriz(data);

  } catch(e) {
    tbodyP.innerHTML = `<tr><td colspan="6" style="text-align:center;padding:20px;color:#dc3545">Error: ${e.message}</td></tr>`;
    tbodyC.innerHTML = `<tr><td colspan="6" style="text-align:center;padding:20px;color:#dc3545">Error: ${e.message}</td></tr>`;
  }
}


// ══════════════════════════════════════════════════════════
//  PEDIDOS DE STOCK
// ══════════════════════════════════════════════════════════

const PS_STATUS_STYLE = {
  'PENDIENTE':  'background:#fff3cd;color:#856404;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:700',
  'ENTREGADO':  'background:#d1e7dd;color:#0f5132;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:700',
  'CANCELADO':  'background:#f8d7da;color:#842029;padding:3px 8px;border-radius:4px;font-size:11px;font-weight:700',
};

// Nombres de meses en español
const PS_MESES = ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
                  'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];

// Inicializar selector de mes (mes actual y 5 anteriores)
function psIniciarMes() {
  const sel = document.getElementById('ps-mes');
  if (!sel || sel.options.length > 0) return;
  const hoy = new Date();
  for (let i = 0; i < 6; i++) {
    const d = new Date(hoy.getFullYear(), hoy.getMonth() - i, 1);
    const val = `${d.getFullYear()}-${String(d.getMonth()+1).padStart(2,'0')}`;
    const lbl = `${PS_MESES[d.getMonth()]} ${d.getFullYear()}`;
    const opt = document.createElement('option');
    opt.value = val; opt.textContent = lbl;
    if (i === 0) opt.selected = true;
    sel.appendChild(opt);
  }
}

