// ── ARKHON — Módulo de Exportación e Impresión ──────────────────────────────
// Soporta pestañas: Productos, Análisis (Gráficas)

// ─── Utilidades ─────────────────────────────────────────────────────────────
const _fmtPeso = n => {
  const v = Number(n || 0);
  return '$' + v.toLocaleString('es-MX', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
};
const _fechaHoy = () => {
  const d = new Date();
  const p = n => String(n).padStart(2, '0');
  return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
};
const _horaAhora = () => {
  const d = new Date();
  const p = n => String(n).padStart(2, '0');
  return `${p(d.getHours())}:${p(d.getMinutes())}`;
};

// ─── Dispatcher principal ────────────────────────────────────────────────────
function exportarExcel() {
  if (currentTab === 'productos') exportarExcelProductos();
  else if (currentTab === 'graficas') exportarExcelGraficas();
}

function imprimirPestana() {
  if (currentTab === 'productos') imprimirProductos();
  else if (currentTab === 'graficas') imprimirGraficas();
}

// ════════════════════════════════════════════════════════════════════════════
// MÓDULO PRODUCTOS
// ════════════════════════════════════════════════════════════════════════════

function exportarExcelProductos() {
  // Use new analytics data if available, fallback to old cache
  const datos = (typeof _prodData !== 'undefined' && _prodData && _prodData.productos)
    ? _prodData
    : null;

  if (!datos || !datos.productos || !datos.productos.length) {
    alert('No hay datos de productos para exportar. Selecciona un período (Hoy/Semana/Mes) primero.');
    return;
  }

  const productos = datos.productos;
  const categorias = datos.categorias || [];
  const resumen = datos.resumen || {};

  const lines = [];
  const desde = datos.desde || _fechaHoy();
  const hasta = datos.hasta || _fechaHoy();
  const periodoLabel = desde === hasta ? desde : `${desde} al ${hasta}`;
  const chartTop = document.getElementById('prod-chart-top')?.toDataURL?.('image/png') || '';
  const chartCat = document.getElementById('prod-chart-cat')?.toDataURL?.('image/png') || '';
  const turnoLabel = document.getElementById('prod-turno-filter')?.selectedOptions?.[0]?.textContent || 'Todos los turnos';
  const estacionLabel = document.getElementById('prod-estacion-filter')?.selectedOptions?.[0]?.textContent || 'Todas las estaciones';
  const grupoLabel = document.getElementById('prod-grupo-filter')?.selectedOptions?.[0]?.textContent || 'Todas las categorías';

  lines.push(`ARKHON — Análisis de Productos — ${periodoLabel}`);
  lines.push(`Generado: ${_fechaHoy()} ${_horaAhora()}`);
  lines.push(`Venta Total: $${(resumen.venta_total||0).toFixed(2)} | Productos: ${resumen.productos_vendidos||0} | Unidades: ${resumen.unidades_totales||0} | Tickets: ${resumen.tickets||0}`);
  lines.push('');

  // Sección 1: Productos vendidos
  lines.push('PRODUCTOS VENDIDOS');
  lines.push('#,Producto,Categoría,Cantidad,Venta,%,Precio Prom.,Tickets,Estado');
  productos.forEach(p => {
    const prod = (p.producto || '—').replace(/,/g, ';');
    const grupo = (p.grupo || '—').replace(/,/g, ';');
    const totalProds = productos.length;
    const idx = p.ranking - 1;
    let estado;
    if (idx < totalProds * 0.3) estado = 'Alto';
    else if (idx < totalProds * 0.7) estado = 'Medio';
    else estado = 'Bajo';
    lines.push(`${p.ranking},"${prod}","${grupo}",${p.cantidad},${p.venta.toFixed(2)},${p.porcentaje}%,${p.precio_promedio.toFixed(2)},${p.tickets},${estado}`);
  });

  lines.push('');

  // Sección 2: Por Categoría
  if (categorias.length) {
    lines.push('VENTAS POR CATEGORÍA');
    lines.push('Categoría,Cantidad,Venta');
    categorias.forEach(c => {
      lines.push(`"${(c.categoria||'—').replace(/,/g,';')}",${c.cantidad},${c.venta.toFixed(2)}`);
    });
  }

  // Sección 3: Sin movimiento
  if (datos.sin_movimiento && datos.sin_movimiento.length) {
    lines.push('');
    lines.push('PRODUCTOS SIN MOVIMIENTO');
    lines.push('#,Producto,Categoría,Clave');
    datos.sin_movimiento.forEach((p, i) => {
      lines.push(`${i+1},"${(p.producto||'—').replace(/,/g,';')}","${(p.grupo||'—').replace(/,/g,';')}",${p.idproducto}`);
    });
  }

  _descargarCSV(lines.join('\n'), `ARKHON_Productos_${desde.replace(/-/g, '')}_${hasta.replace(/-/g, '')}.csv`);
}

function imprimirProductos() {
  const datos = (typeof _prodData !== 'undefined' && _prodData && _prodData.productos) ? _prodData : null;
  if (!datos) { alert('No hay datos para imprimir.'); return; }

  const productos = datos.productos;
  const categorias = datos.categorias || [];
  const resumen = datos.resumen || {};
  const desde = datos.desde || _fechaHoy();
  const hasta = datos.hasta || _fechaHoy();
  const periodoLabel = desde === hasta ? desde : `${desde} al ${hasta}`;

  const totalProds = productos.length;
  const filasProd = productos.map((p, i) => {
    let color;
    if (i < totalProds * 0.3) color = '#22c55e';
    else if (i < totalProds * 0.7) color = '#f59e0b';
    else color = '#ef4444';
    return `<tr>
      <td style="text-align:center"><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:${color};"></span> ${p.ranking}</td>
      <td style="font-weight:700">${p.producto || '—'}</td>
      <td style="color:#6b7280;font-size:11px">${p.grupo || '—'}</td>
      <td style="text-align:right">${p.cantidad.toLocaleString('es-MX')}</td>
      <td style="text-align:right;font-weight:700">$${p.venta.toLocaleString('es-MX',{minimumFractionDigits:2})}</td>
      <td style="text-align:right;color:#6b7280">${p.porcentaje}%</td>
    </tr>`;
  }).join('');

  const filasGrupo = categorias.map(c => `<tr>
    <td style="font-weight:700">${c.categoria || '—'}</td>
    <td style="text-align:right">${(c.cantidad||0).toLocaleString('es-MX')}</td>
    <td style="text-align:right;font-weight:700">$${(c.venta||0).toLocaleString('es-MX',{minimumFractionDigits:2})}</td>
  </tr>`).join('');

  const html = `<!DOCTYPE html><html lang="es"><head><meta charset="UTF-8">
  <title>ARKHON — Productos</title>
  <style>
    *{margin:0;padding:0;box-sizing:border-box;}
    body{font-family:Arial,sans-serif;font-size:12px;color:#111;background:#fff;padding:20px;}
    .header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;padding-bottom:10px;border-bottom:2px solid #f97316;}
    .logo{background:#f97316;color:#fff;font-weight:800;font-size:14px;padding:6px 14px;border-radius:4px;letter-spacing:1px;}
    .meta{text-align:right;font-size:11px;color:#555;line-height:1.7;}
    .kpis{display:flex;gap:16px;margin-bottom:16px;}
    .kpi{text-align:center;flex:1;padding:8px;background:#f9fafb;border-radius:6px;}
    .kpi-label{font-size:9px;text-transform:uppercase;color:#6b7280;font-weight:600;}
    .kpi-value{font-size:16px;font-weight:800;margin-top:2px;}
    .filters{display:flex;gap:8px;flex-wrap:wrap;margin:-6px 0 14px;font-size:10.5px;color:#4b5563;}
    .filters span{background:#f9fafb;border:1px solid #e5e7eb;border-radius:999px;padding:5px 9px;}
    .charts{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:16px;page-break-inside:avoid;}
    .chart-box{border:1px solid #e5e7eb;border-radius:8px;padding:10px;text-align:center;}
    .chart-box h2{margin:0 0 8px;font-size:12px;}
    .chart-box img{max-width:100%;height:220px;object-fit:contain;}
    h2{font-size:14px;font-weight:800;margin:14px 0 8px;color:#1f2937;}
    table{width:100%;border-collapse:collapse;margin-bottom:16px;font-size:11.5px;}
    thead tr{background:#1f2937;color:#fff;}
    thead th{padding:6px 8px;text-align:left;font-weight:700;font-size:10px;}
    tbody tr:nth-child(even){background:#f9fafb;}
    tbody td{padding:5px 8px;border-bottom:1px solid #e5e7eb;}
    .footer{margin-top:16px;border-top:1px solid #e5e7eb;padding-top:8px;font-size:9.5px;color:#9ca3af;text-align:right;}
    @media(max-width:700px){.charts{grid-template-columns:1fr}.kpis{flex-wrap:wrap}.kpi{min-width:31%}}
    @media print{body{padding:0;}@page{margin:15mm;}.charts{break-inside:avoid;}}
  </style></head><body>
  <div class="header">
    <div><div class="logo">ARKHON</div></div>
    <div class="meta">
      <div><strong>Reporte:</strong> Análisis de Productos</div>
      <div><strong>Período:</strong> ${periodoLabel}</div>
      <div><strong>Generado:</strong> ${_fechaHoy()} ${_horaAhora()}</div>
    </div>
  </div>
  <div class="filters">
    <span>${turnoLabel}</span>
    <span>${estacionLabel}</span>
    <span>${grupoLabel}</span>
  </div>
  <div class="kpis">
    <div class="kpi"><div class="kpi-label">Venta Total</div><div class="kpi-value">$${(resumen.venta_total||0).toLocaleString('es-MX',{minimumFractionDigits:2})}</div></div>
    <div class="kpi"><div class="kpi-label">Productos</div><div class="kpi-value">${resumen.productos_vendidos||0}</div></div>
    <div class="kpi"><div class="kpi-label">Unidades</div><div class="kpi-value">${(resumen.unidades_totales||0).toLocaleString()}</div></div>
    <div class="kpi"><div class="kpi-label">Tickets</div><div class="kpi-value">${resumen.tickets||0}</div></div>
    <div class="kpi"><div class="kpi-label">Ticket Prom.</div><div class="kpi-value">$${(resumen.ticket_promedio||0).toLocaleString('es-MX',{minimumFractionDigits:2})}</div></div>
  </div>
  <div class="charts">
    <div class="chart-box"><h2>Top 10 Productos</h2>${chartTop ? `<img src="${chartTop}" alt="Top 10 Productos">` : '<div style="color:#9ca3af;padding:40px 0">Sin gráfica</div>'}</div>
    <div class="chart-box"><h2>Ventas por Categoría</h2>${chartCat ? `<img src="${chartCat}" alt="Ventas por Categoría">` : '<div style="color:#9ca3af;padding:40px 0">Sin gráfica</div>'}</div>
  </div>
  <h2>Productos Vendidos</h2>
  <table>
    <thead><tr><th>#</th><th>Producto</th><th>Categoría</th><th style="text-align:right">Cant.</th><th style="text-align:right">Venta</th><th style="text-align:right">%</th></tr></thead>
    <tbody>${filasProd || '<tr><td colspan="6" style="text-align:center;color:#9ca3af;padding:12px">Sin datos</td></tr>'}</tbody>
  </table>
  <h2>Por Categoría</h2>
  <table>
    <thead><tr><th>Categoría</th><th style="text-align:right">Cantidad</th><th style="text-align:right">Venta</th></tr></thead>
    <tbody>${filasGrupo}</tbody>
  </table>
  <div class="footer">ARKHON Monitor &mdash; Análisis de Productos &mdash; ${_fechaHoy()} ${_horaAhora()}</div>
  </body></html>`;

  _abrirVentanaImpresion(html);
}

// ════════════════════════════════════════════════════════════════════════════
// MÓDULO ANÁLISIS (GRÁFICAS)
// ════════════════════════════════════════════════════════════════════════════

function exportarExcelGraficas() {
  const p = typeof gfParams === 'function' ? gfParams() : { anioActual: new Date().getFullYear(), anioAnterior: new Date().getFullYear() - 1 };
  const tab = typeof gfTab !== 'undefined' ? gfTab : 'anual';
  const gd  = typeof gfData !== 'undefined' ? gfData : {};

  const lines = [];
  lines.push(`ARKHON — Análisis — ${tab.toUpperCase()} — ${_fechaHoy()} ${_horaAhora()}`);
  lines.push('');

  if (tab === 'anual') {
    // Ventas por año
    lines.push('VENTAS TOTALES POR AÑO');
    lines.push('Año,Venta Total');
    (gd.anual || []).forEach(r => lines.push(`${r.anio},${Number(r.venta_total || 0).toFixed(2)}`));
    lines.push('');

    // Mes a mes
    lines.push(`MES A MES — ${p.anioActual} vs ${p.anioAnterior}`);
    lines.push(`Mes,Venta ${p.anioActual},Tickets ${p.anioActual},Venta ${p.anioAnterior},Tickets ${p.anioAnterior}`);
    (gd.mesAMes || []).forEach(r => {
      lines.push(`${r.mes},${Number(r.venta_actual || 0).toFixed(2)},${r.tickets_actual || 0},${Number(r.venta_anterior || 0).toFixed(2)},${r.tickets_anterior || 0}`);
    });
    lines.push('');

    // Comparativo por día
    lines.push(`COMPARATIVO POR DÍA — ${p.anioActual} vs ${p.anioAnterior}`);
    lines.push(`Día,Venta ${p.anioActual},Venta ${p.anioAnterior}`);
    (gd.diasComp || []).forEach(r => {
      lines.push(`${r.dia},${Number(r.venta_actual || 0).toFixed(2)},${Number(r.venta_anterior || 0).toFixed(2)}`);
    });

  } else if (tab === 'productos') {
    lines.push(`TOP PRODUCTOS POR CANTIDAD — ${p.anioActual}`);
    lines.push('Producto,Cantidad,Importe');
    (gd.topCant || []).forEach(r => lines.push(`"${(r.producto || '').replace(/"/g, '""')}",${r.total_cantidad || 0},${Number(r.total_importe || 0).toFixed(2)}`));
    lines.push('');

    lines.push(`TOP PRODUCTOS POR IMPORTE — ${p.anioActual}`);
    lines.push('Producto,Cantidad,Importe');
    (gd.topImp || []).forEach(r => lines.push(`"${(r.producto || '').replace(/"/g, '""')}",${r.total_cantidad || 0},${Number(r.total_importe || 0).toFixed(2)}`));
    lines.push('');

    lines.push(`COMPARATIVO DE PRODUCTOS — ${p.anioActual} vs ${p.anioAnterior}`);
    lines.push(`Producto,Cant. ${p.anioActual},Imp. ${p.anioActual},Cant. ${p.anioAnterior},Imp. ${p.anioAnterior}`);
    (gd.compProd || []).forEach(r => lines.push(`"${(r.producto || '').replace(/"/g, '""')}",${r.cantidad_actual || 0},${Number(r.importe_actual || 0).toFixed(2)},${r.cantidad_anterior || 0},${Number(r.importe_anterior || 0).toFixed(2)}`));

  } else if (tab === 'meses') {
    lines.push(`VENTAS MES A MES — ${p.anioActual} vs ${p.anioAnterior}`);
    lines.push(`Mes,Venta ${p.anioActual},Tickets ${p.anioActual},Venta ${p.anioAnterior},Tickets ${p.anioAnterior}`);
    (gd.mesAMes || []).forEach(r => {
      lines.push(`${r.mes},${Number(r.venta_actual || 0).toFixed(2)},${r.tickets_actual || 0},${Number(r.venta_anterior || 0).toFixed(2)},${r.tickets_anterior || 0}`);
    });

  } else if (tab === 'categorias') {
    lines.push(`COMPARATIVO POR CATEGORÍA — ${p.anioActual} vs ${p.anioAnterior}`);
    lines.push(`Categoría,Cant. ${p.anioActual},Imp. ${p.anioActual},Cant. ${p.anioAnterior},Imp. ${p.anioAnterior}`);
    (gd.categorias || []).forEach(r => lines.push(`"${(r.grupo || '').replace(/"/g, '""')}",${r.cantidad_actual || 0},${Number(r.importe_actual || 0).toFixed(2)},${r.cantidad_anterior || 0},${Number(r.importe_anterior || 0).toFixed(2)}`));

  } else {
    alert('Exportación no disponible para esta vista de análisis.');
    return;
  }

  const sufijo = tab.charAt(0).toUpperCase() + tab.slice(1);
  _descargarCSV(lines.join('\n'), `ARKHON_Analisis_${sufijo}_${_fechaHoy().replace(/-/g,'')}.csv`);
}

function imprimirGraficas() {
  const p = typeof gfParams === 'function' ? gfParams() : { anioActual: new Date().getFullYear(), anioAnterior: new Date().getFullYear() - 1 };
  const tab = typeof gfTab !== 'undefined' ? gfTab : 'anual';
  const gd  = typeof gfData !== 'undefined' ? gfData : {};

  // ── Captura canvas de Chart.js como imagen base64 ──────────────────────────
  function captureChart(canvasId, titulo) {
    const canvas = document.getElementById(canvasId);
    if (!canvas) return '';
    try {
      const img = canvas.toDataURL('image/png');
      return `<div class="chart-block">
        <div class="chart-title">${titulo}</div>
        <img src="${img}" style="width:100%;max-width:100%;border-radius:4px;border:1px solid #e5e7eb;" />
      </div>`;
    } catch(_) { return ''; }
  }

  let titulo = 'Análisis';
  let graficasHTML = '';
  let tablaHTML    = '';
  const colorsRow = ['#f97316','#2563eb','#10b981','#f59e0b','#7c3aed','#06b6d4','#ec4899','#ef4444'];

  if (tab === 'anual') {
    titulo = `Resumen Anual — ${p.anioActual} vs ${p.anioAnterior}`;

    graficasHTML = `
      <div class="charts-grid-1">${captureChart('chart-anual','Ventas totales por año')}</div>
      <div class="charts-grid-2">
        ${captureChart('chart-mes-mes',`Mes a mes — ${p.anioActual} vs ${p.anioAnterior}`)}
        ${captureChart('chart-dias-comp',`Comparativo por día — ${p.anioActual} vs ${p.anioAnterior}`)}
      </div>`;

    // Tabla mes a mes
    const filasMes = (gd.mesAMes || []).map(r => `<tr>
      <td style="font-weight:700">${r.mes}</td>
      <td style="text-align:right;color:#f97316;font-weight:700">${_fmtPeso(r.venta_actual)}</td>
      <td style="text-align:right">${(r.tickets_actual||0).toLocaleString('es-MX')}</td>
      <td style="text-align:right;color:#2563eb;font-weight:700">${_fmtPeso(r.venta_anterior)}</td>
      <td style="text-align:right">${(r.tickets_anterior||0).toLocaleString('es-MX')}</td>
    </tr>`).join('');
    const tA = (gd.mesAMes||[]).reduce((s,r)=>s+Number(r.venta_actual||0),0);
    const tB = (gd.mesAMes||[]).reduce((s,r)=>s+Number(r.venta_anterior||0),0);
    const tkA= (gd.mesAMes||[]).reduce((s,r)=>s+Number(r.tickets_actual||0),0);
    const tkB= (gd.mesAMes||[]).reduce((s,r)=>s+Number(r.tickets_anterior||0),0);

    tablaHTML = `
      <h2>Mes a Mes — ${p.anioActual} vs ${p.anioAnterior}</h2>
      <table><thead><tr>
        <th>Mes</th><th style="text-align:right;color:#fde8d0">${p.anioActual}</th>
        <th style="text-align:right">Tickets</th>
        <th style="text-align:right;color:#d0ddf8">${p.anioAnterior}</th>
        <th style="text-align:right">Tickets</th>
      </tr></thead>
      <tbody>${filasMes}</tbody>
      <tfoot><tr><td>TOTAL</td><td style="text-align:right">${_fmtPeso(tA)}</td>
        <td style="text-align:right">${tkA.toLocaleString('es-MX')}</td>
        <td style="text-align:right">${_fmtPeso(tB)}</td>
        <td style="text-align:right">${tkB.toLocaleString('es-MX')}</td>
      </tr></tfoot></table>`;

  } else if (tab === 'productos') {
    titulo = `Top Productos — ${p.anioActual}`;
    graficasHTML = `
      <div class="charts-grid-2">
        ${captureChart('chart-top-cant','Por cantidad vendida')}
        ${captureChart('chart-top-imp','Por importe')}
      </div>
      <div class="charts-grid-1">${captureChart('chart-comp-prod',`Comparativo ${p.anioActual} vs ${p.anioAnterior}`)}</div>`;

    const filasCant = (gd.topCant||[]).map((r,i)=>`<tr>
      <td style="font-weight:700;color:${colorsRow[i%8]}">${r.producto||'—'}</td>
      <td style="text-align:right;font-weight:700">${(r.total_cantidad||0).toLocaleString('es-MX')}</td>
      <td style="text-align:right">${_fmtPeso(r.total_importe)}</td></tr>`).join('');
    const filasImp = (gd.topImp||[]).map((r,i)=>`<tr>
      <td style="font-weight:700;color:${colorsRow[i%8]}">${r.producto||'—'}</td>
      <td style="text-align:right">${(r.total_cantidad||0).toLocaleString('es-MX')}</td>
      <td style="text-align:right;font-weight:700">${_fmtPeso(r.total_importe)}</td></tr>`).join('');

    tablaHTML = `
      <h2>Top por Cantidad</h2>
      <table><thead><tr><th>Producto</th><th style="text-align:right">Cantidad</th><th style="text-align:right">Importe</th></tr></thead>
      <tbody>${filasCant}</tbody></table>
      <h2>Top por Importe</h2>
      <table><thead><tr><th>Producto</th><th style="text-align:right">Cantidad</th><th style="text-align:right">Importe</th></tr></thead>
      <tbody>${filasImp}</tbody></table>`;

  } else if (tab === 'meses') {
    titulo = `Ventas Mes a Mes — ${p.anioActual} vs ${p.anioAnterior}`;
    graficasHTML = `<div class="charts-grid-1">${captureChart('chart-mes-mes2','Ventas mes a mes')}</div>`;

    const filasMes2 = (gd.mesAMes||[]).map(r=>`<tr>
      <td style="font-weight:700">${r.mes}</td>
      <td style="text-align:right;color:#f97316;font-weight:700">${_fmtPeso(r.venta_actual)}</td>
      <td style="text-align:right">${(r.tickets_actual||0).toLocaleString('es-MX')}</td>
      <td style="text-align:right;color:#2563eb;font-weight:700">${_fmtPeso(r.venta_anterior)}</td>
      <td style="text-align:right">${(r.tickets_anterior||0).toLocaleString('es-MX')}</td>
    </tr>`).join('');
    const tA2=(gd.mesAMes||[]).reduce((s,r)=>s+Number(r.venta_actual||0),0);
    const tB2=(gd.mesAMes||[]).reduce((s,r)=>s+Number(r.venta_anterior||0),0);

    tablaHTML = `
      <h2>Mes a Mes — ${p.anioActual} vs ${p.anioAnterior}</h2>
      <table><thead><tr>
        <th>Mes</th><th style="text-align:right;color:#fde8d0">${p.anioActual}</th>
        <th style="text-align:right">Tickets</th>
        <th style="text-align:right;color:#d0ddf8">${p.anioAnterior}</th>
        <th style="text-align:right">Tickets</th>
      </tr></thead>
      <tbody>${filasMes2}</tbody>
      <tfoot><tr><td>TOTAL</td><td style="text-align:right">${_fmtPeso(tA2)}</td><td></td>
        <td style="text-align:right">${_fmtPeso(tB2)}</td><td></td></tr></tfoot></table>`;

  } else if (tab === 'categorias') {
    titulo = `Por Categoría — ${p.anioActual} vs ${p.anioAnterior}`;
    graficasHTML = `<div class="charts-grid-1">${captureChart('chart-categorias',`Comparativo por categoría — ${p.anioActual} vs ${p.anioAnterior}`)}</div>`;

    const filasCat = (gd.categorias||[]).map((r,i)=>`<tr>
      <td style="font-weight:700;color:${colorsRow[i%8]}">${r.grupo||'—'}</td>
      <td style="text-align:right;font-weight:700">${(r.cantidad_actual||0).toLocaleString('es-MX')}</td>
      <td style="text-align:right">${_fmtPeso(r.importe_actual)}</td>
      <td style="text-align:right">${(r.cantidad_anterior||0).toLocaleString('es-MX')}</td>
      <td style="text-align:right">${_fmtPeso(r.importe_anterior)}</td></tr>`).join('');

    tablaHTML = `
      <h2>Comparativo por Categoría</h2>
      <table><thead><tr>
        <th>Categoría</th>
        <th style="text-align:right">Cant. ${p.anioActual}</th><th style="text-align:right">Imp. ${p.anioActual}</th>
        <th style="text-align:right">Cant. ${p.anioAnterior}</th><th style="text-align:right">Imp. ${p.anioAnterior}</th>
      </tr></thead>
      <tbody>${filasCat}</tbody></table>`;

  } else {
    alert('Impresión no disponible para análisis avanzado.');
    return;
  }

  const html = `<!DOCTYPE html><html lang="es"><head><meta charset="UTF-8">
  <title>ARKHON — Análisis</title>
  <style>
    *{margin:0;padding:0;box-sizing:border-box;}
    body{font-family:Arial,sans-serif;font-size:12px;color:#111;background:#fff;padding:20px;}
    .header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;padding-bottom:10px;border-bottom:2px solid #f97316;}
    .logo{background:#f97316;color:#fff;font-weight:800;font-size:14px;padding:6px 14px;border-radius:4px;letter-spacing:1px;}
    .meta{text-align:right;font-size:11px;color:#555;line-height:1.7;}
    h2{font-size:13px;font-weight:800;margin:16px 0 8px;color:#1f2937;padding-bottom:4px;border-bottom:1px solid #e5e7eb;}
    .charts-grid-1{margin-bottom:14px;}
    .charts-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:14px;}
    .chart-block{background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;padding:10px;}
    .chart-title{font-size:11px;font-weight:800;color:#374151;margin-bottom:8px;text-transform:uppercase;letter-spacing:.04em;}
    table{width:100%;border-collapse:collapse;margin-bottom:16px;font-size:11.5px;}
    thead tr{background:#3a5a8a;color:#fff;}
    thead th{padding:6px 8px;text-align:left;font-weight:700;font-size:11px;}
    tbody tr:nth-child(even){background:#f9fafb;}
    tbody td{padding:5px 8px;border-bottom:1px solid #e5e7eb;}
    tfoot td{background:#f3f4f6;font-weight:700;padding:5px 8px;border-top:2px solid #aaa;}
    .footer{margin-top:16px;border-top:1px solid #e5e7eb;padding-top:8px;font-size:9.5px;color:#9ca3af;text-align:right;}
    @media print{
      body{padding:0;}
      @page{margin:12mm;}
      .charts-grid-2{grid-template-columns:1fr 1fr;}
      .chart-block{break-inside:avoid;}
    }
  </style></head><body>
  <div class="header">
    <div><div class="logo">ARKHON</div></div>
    <div class="meta">
      <div><strong>Reporte:</strong> Análisis — ${titulo}</div>
      <div><strong>Generado:</strong> ${_fechaHoy()} ${_horaAhora()}</div>
    </div>
  </div>
  ${graficasHTML}
  ${tablaHTML}
  <div class="footer">ARKHON Monitor &mdash; Análisis &mdash; ${_fechaHoy()} ${_horaAhora()}</div>
  </body></html>`;

  _abrirVentanaImpresion(html);
}

// ─── Helpers internos ────────────────────────────────────────────────────────
function _descargarCSV(contenido, nombreArchivo) {
  const BOM = '\uFEFF';
  const blob = new Blob([BOM + contenido], { type: 'text/csv;charset=utf-8;' });
  const url  = URL.createObjectURL(blob);
  const a    = document.createElement('a');
  a.href     = url;
  a.download = nombreArchivo;
  document.body.appendChild(a);
  a.click();
  document.body.removeChild(a);
  URL.revokeObjectURL(url);
}

function _abrirVentanaImpresion(html) {
  // FIX: usar Blob URL en lugar de document.write para evitar XSS en ventana de impresión.
  // document.write() ejecuta cualquier <script> presente en el HTML directamente.
  // Con Blob + URL.createObjectURL el navegador trata el contenido como recurso externo
  // y aplica las restricciones normales del origen.
  try {
    const blob = new Blob([html], { type: 'text/html;charset=utf-8' });
    const url  = URL.createObjectURL(blob);
    const w    = window.open(url, '_blank', 'width=960,height=750');
    if (!w) { URL.revokeObjectURL(url); alert('Permite ventanas emergentes para imprimir.'); return; }
    // Revocar la URL después de que la ventana la haya cargado
    w.addEventListener('load', () => { URL.revokeObjectURL(url); setTimeout(() => { w.print(); }, 300); });
    // Fallback si load no dispara (algunos navegadores)
    setTimeout(() => { URL.revokeObjectURL(url); }, 30000);
  } catch (_) {
    // Fallback legacy si Blob/URL API no está disponible
    const w = window.open('', '_blank', 'width=960,height=750');
    if (!w) { alert('Permite ventanas emergentes para imprimir.'); return; }
    w.document.write(html);
    w.document.close();
    w.focus();
    setTimeout(() => { w.print(); }, 500);
  }
}
