'use strict';
// PDFKit se carga bajo demanda (lazy) para no consumir ~10MB de heap al arrancar.
let PDFDocument = null;
function getPDFDocument() {
  if (!PDFDocument) PDFDocument = require('pdfkit');
  return PDFDocument;
}

// ── Paleta ────────────────────────────────────────────────────────────────────
const ORANGE = '#E67E22';
const DARK   = '#1C2341';
const BLUE   = '#3A5A8A';
const GRAY   = '#6B7280';
const LGRAY  = '#E5E7EB';
const WHITE  = '#FFFFFF';
const GREEN  = '#229954';
const RED    = '#C0392B';

const fmt = n => `$${Number(n||0).toLocaleString('es-MX',{minimumFractionDigits:2,maximumFractionDigits:2})}`;
const pct = (a,b) => b>0 ? ((a/b)*100).toFixed(1)+'%' : '0.0%';

function rgb(hex) {
  return [parseInt(hex.slice(1,3),16), parseInt(hex.slice(3,5),16), parseInt(hex.slice(5,7),16)];
}
function fill(doc, hex) { const [r,g,b]=rgb(hex); doc.fillColor([r,g,b]); }
function stroke(doc, hex) { const [r,g,b]=rgb(hex); doc.strokeColor([r,g,b]); }

// ── Header de pagina ──────────────────────────────────────────────────────────
function pageHeader(doc, negocio, periodo, titulo) {
  const [or,og,ob] = rgb(ORANGE);
  doc.rect(0,0,595,48).fillColor([or,og,ob]).fill();
  fill(doc, WHITE);
  doc.font('Helvetica-Bold').fontSize(14).text(negocio, 24, 10);
  doc.font('Helvetica').fontSize(8).text('ARKHON Monitor', 24, 27);
  doc.font('Helvetica-Bold').fontSize(10).text(titulo, 0, 10, {width:571, align:'right'});
  doc.font('Helvetica').fontSize(7.5).text(periodo, 0, 24, {width:571, align:'right'});
}

// ── Celda de tabla ────────────────────────────────────────────────────────────
function cellBg(doc, x, y, w, h, hex) {
  const [r,g,b] = rgb(hex);
  doc.rect(x,y,w,h).fillColor([r,g,b]).fill();
}

// ── Encabezado de seccion ─────────────────────────────────────────────────────
function secHeader(doc, x, y, w, label) {
  cellBg(doc, x, y, w, 16, BLUE);
  fill(doc, WHITE);
  doc.font('Helvetica-Bold').fontSize(8).text(label, x+6, y+4, {width:w-12});
  return y + 16;
}

// ── Fila de tabla ─────────────────────────────────────────────────────────────
function tableRow(doc, x, y, cols, isHeader=false, altRow=false) {
  const H = 14;
  if (isHeader) {
    cellBg(doc, x, y, cols.reduce((s,c)=>s+c.w,0), H, DARK);
  } else if (altRow) {
    cellBg(doc, x, y, cols.reduce((s,c)=>s+c.w,0), H, '#F9FAFB');
  }
  let cx = x;
  cols.forEach(col => {
    fill(doc, isHeader ? WHITE : DARK);
    doc.font(isHeader||col.bold ? 'Helvetica-Bold':'Helvetica')
       .fontSize(7.5)
       .text(col.v||'', cx+4, y+3, {width:col.w-8, align:col.align||'left', lineBreak:false});
    cx += col.w;
  });
  // linea horizontal
  stroke(doc, LGRAY);
  doc.moveTo(x, y+H).lineTo(x+cols.reduce((s,c)=>s+c.w,0), y+H).lineWidth(0.3).stroke();
  return y + H;
}

// ── KPI box ───────────────────────────────────────────────────────────────────
function kpiBox(doc, x, y, w, h, label, value, sub, color) {
  const [r,g,b] = rgb(WHITE);
  doc.roundedRect(x,y,w,h,4).fillColor([r,g,b]).fill();
  stroke(doc, LGRAY);
  doc.roundedRect(x,y,w,h,4).lineWidth(0.5).stroke();
  // borde color
  const [cr,cg,cb] = rgb(color||ORANGE);
  doc.rect(x,y,3,h).fillColor([cr,cg,cb]).fill();
  fill(doc, GRAY);
  doc.font('Helvetica').fontSize(6.5).text(label, x+8, y+6, {width:w-14});
  fill(doc, DARK);
  doc.font('Helvetica-Bold').fontSize(12).text(value, x+8, y+16, {width:w-14, lineBreak:false});
  fill(doc, GRAY);
  doc.font('Helvetica').fontSize(6).text(sub||'', x+8, y+31, {width:w-14});
}

// ── Barra horizontal ─────────────────────────────────────────────────────────
function barH(doc, x, y, totalW, val, maxVal, color) {
  const w = maxVal > 0 ? Math.max((val/maxVal) * totalW, 2) : 2;
  const [lr,lg,lb] = rgb(LGRAY);
  doc.rect(x,y,totalW,7).fillColor([lr,lg,lb]).fill();
  const [cr,cg,cb] = rgb(color||ORANGE);
  doc.rect(x,y,w,7).fillColor([cr,cg,cb]).fill();
}

// ── Linea separadora ─────────────────────────────────────────────────────────
function hline(doc, x, y, w, hex) {
  stroke(doc, hex||LGRAY);
  doc.moveTo(x,y).lineTo(x+w,y).lineWidth(0.5).stroke();
}

// ════════════════════════════════════════════════════════════════════════════
// FUNCION PRINCIPAL
// ════════════════════════════════════════════════════════════════════════════
function generarPDF(data, negocio, res) {
  const doc = new (getPDFDocument())({
    size:'A4', margins:{top:20,bottom:20,left:24,right:24},
    bufferPages: true,
    info:{ Title:`Reporte ARKHON ${data.periodo?.inicio} - ${data.periodo?.fin}`, Author:'ARKHON' }
  });

  res.setHeader('Content-Type','application/pdf');
  res.setHeader('Content-Disposition',
    `attachment; filename="reporte_${(data.periodo?.inicio||'').replace(/\//g,'-')}.pdf"`);
  doc.pipe(res);

  const PW = 547; // 595 - 48 (margins)
  const t  = data.totales || {};
  const a  = data.anterior || {};
  const fp = data.formasPago || [];
  const vs = data.ventasServicio || [];
  const vpd= data.ventasPorDia || [];
  const vpt= data.ventasPorTipo || [];
  const mes= data.meseros || [];
  const periodo = `${data.periodo?.inicio || ''} al ${data.periodo?.fin || ''}`;
  const dias = data.periodo?.dias || 1;

  const venta    = t.venta_total || t.venta_con_impuesto || 0;
  const subtotal = t.subtotal || t.venta_neta || 0;
  const impuesto = t.impuestos || t.impuesto || (venta - subtotal) || 0;
  const tickets  = t.tickets || t.cuentas_pagadas || 0;
  const desctos  = t.descuentos || t.total_descuentos || 0;
  const alim     = t.alimentos || 0;
  const beb      = t.bebidas || 0;
  const otros    = t.otros || 0;
  const propinas = t.propinas || 0;
  const ticketProm = tickets > 0 ? venta / tickets : 0;
  const varPct   = a.venta_total > 0 ? ((venta - a.venta_total)/a.venta_total*100) : null;

  // ══════════════════════════════════════════════════
  // PAGINA 1 — RESUMEN EJECUTIVO
  // ══════════════════════════════════════════════════
  pageHeader(doc, negocio, periodo, 'REPORTE DE VENTAS');
  let y = 58;

  // ── KPIs principales ────────────────────────────────────────────────────
  const kpiW = (PW - 15) / 4;
  kpiBox(doc, 24,        y, kpiW, 52, 'VENTA TOTAL',      fmt(venta),       `${dias} dia(s)`,      ORANGE);
  kpiBox(doc, 24+kpiW+5, y, kpiW, 52, 'TICKETS',          String(tickets),  'cuentas cerradas',    BLUE);
  kpiBox(doc, 24+kpiW*2+10,y,kpiW,52, 'TICKET PROMEDIO',  fmt(ticketProm),  'por cuenta',          GREEN);
  const varTxt = varPct !== null ? (varPct>=0?'+':'')+varPct.toFixed(1)+'%' : 'N/D';
  kpiBox(doc, 24+kpiW*3+15,y,kpiW,52, 'VS PERIODO ANT.',  varTxt,           fmt(a.venta_total||0), varPct===null?GRAY:varPct>=0?GREEN:RED);
  y += 62;

  // ── Segunda fila de KPIs ────────────────────────────────────────────────
  const kpiW2 = (PW - 20) / 5;
  kpiBox(doc, 24,             y, kpiW2, 44, 'ALIMENTOS',   fmt(alim),     pct(alim,venta),    ORANGE);
  kpiBox(doc, 24+kpiW2+5,    y, kpiW2, 44, 'BEBIDAS',     fmt(beb),      pct(beb,venta),     BLUE);
  kpiBox(doc, 24+kpiW2*2+10, y, kpiW2, 44, 'DESCUENTOS',  fmt(desctos),  pct(desctos,venta), RED);
  kpiBox(doc, 24+kpiW2*3+15, y, kpiW2, 44, 'PROPINAS',    fmt(propinas), '',                 GREEN);
  kpiBox(doc, 24+kpiW2*4+20, y, kpiW2, 44, 'IMPUESTO',    fmt(impuesto), pct(impuesto,venta),GRAY);
  y += 54;

  // ── Formas de pago ────────────────────────────────────────────────────────
  const colL = PW * 0.48;
  const colR = PW - colL - 12;
  const fpMaxVal = fp.reduce((m,p) => Math.max(m, p.total||0), 1);

  y = secHeader(doc, 24, y, colL, 'FORMAS DE PAGO');
  y = tableRow(doc, 24, y, [
    {v:'FORMA',w:colL*0.45,bold:true}, {v:'TOTAL',w:colL*0.32,align:'right',bold:true},
    {v:'%',w:colL*0.13,align:'right',bold:true}, {v:'CTAS',w:colL*0.10,align:'right',bold:true}
  ], true);
  fp.forEach((p,i) => {
    y = tableRow(doc, 24, y, [
      {v:p.forma_pago||'—',    w:colL*0.45},
      {v:fmt(p.total||0),      w:colL*0.32, align:'right', bold:true},
      {v:pct(p.total||0,venta),w:colL*0.13, align:'right'},
      {v:String(p.tickets||0), w:colL*0.10, align:'right'},
    ], false, i%2===0);
  });
  // Total
  cellBg(doc, 24, y, colL, 14, '#EFF6FF');
  fill(doc, DARK);
  doc.font('Helvetica-Bold').fontSize(7.5).text('TOTAL COBRADO', 28, y+3, {width:colL*0.44});
  doc.font('Helvetica-Bold').fontSize(7.5).text(fmt(fp.reduce((s,p)=>s+(p.total||0),0)), 24, y+3, {width:colL-8, align:'right', lineBreak:false});
  y += 14;

  // ── Ventas por servicio / area ────────────────────────────────────────────
  const yR0 = 58 + 62 + 54; // alinear con formas de pago
  let yR = secHeader(doc, 24+colL+12, yR0, colR, 'VENTAS POR AREA / SERVICIO');
  yR = tableRow(doc, 24+colL+12, yR, [
    {v:'AREA',w:colR*0.48,bold:true},{v:'VENTA',w:colR*0.32,align:'right',bold:true},{v:'%',w:colR*0.20,align:'right',bold:true}
  ], true);
  const vsMax = vs.reduce((m,s)=>Math.max(m,s.total||s.venta||0),1);
  vs.forEach((s,i) => {
    const sv = s.total||s.venta||0;
    yR = tableRow(doc, 24+colL+12, yR, [
      {v:s.servicio||'—', w:colR*0.48},
      {v:fmt(sv),         w:colR*0.32, align:'right', bold:true},
      {v:pct(sv,venta),   w:colR*0.20, align:'right'},
    ], false, i%2===0);
    // mini barra
    barH(doc, 24+colL+12+4, yR-5, colR*0.44, sv, vsMax, BLUE);
    yR += 3;
  });

  y = Math.max(y, yR) + 10;

  // ── Detalle de venta (alimentos/bebidas/otros) ─────────────────────────────
  const midW = (PW - 12) / 2;
  y = secHeader(doc, 24, y, midW, 'DESGLOSE DE VENTA');
  const desglose = [
    {v:'Alimentos',       a:fmt(alim),     b:pct(alim,venta)},
    {v:'Bebidas',         a:fmt(beb),      b:pct(beb,venta)},
    {v:'Otros',           a:fmt(otros),    b:pct(otros,venta)},
  ];
  desglose.forEach((r,i) => {
    y = tableRow(doc, 24, y, [
      {v:r.v, w:midW*0.50},{v:r.a, w:midW*0.30, align:'right', bold:true},{v:r.b, w:midW*0.20, align:'right'}
    ], false, i%2===0);
  });
  hline(doc, 24, y, midW, LGRAY); y++;
  y = tableRow(doc, 24, y, [{v:'Subtotal sin imp.',w:midW*0.50},{v:fmt(subtotal),w:midW*0.30,align:'right',bold:true},{v:pct(subtotal,venta),w:midW*0.20,align:'right'}], false, false);
  y = tableRow(doc, 24, y, [{v:'- Descuentos',    w:midW*0.50},{v:fmt(desctos),  w:midW*0.30,align:'right',bold:true},{v:pct(desctos,venta), w:midW*0.20,align:'right'}], false, true);
  y = tableRow(doc, 24, y, [{v:'+ Impuesto',      w:midW*0.50},{v:fmt(impuesto), w:midW*0.30,align:'right',bold:true},{v:pct(impuesto,venta),w:midW*0.20,align:'right'}], false, false);
  cellBg(doc, 24, y, midW, 14, '#FFF7ED');
  fill(doc, DARK);
  doc.font('Helvetica-Bold').fontSize(7.5).text('VENTA TOTAL CON IMP.', 28, y+3);
  doc.font('Helvetica-Bold').fontSize(8.5).text(fmt(venta), 24, y+2, {width:midW-8, align:'right', lineBreak:false});
  y += 16;

  // ── Top Meseros ────────────────────────────────────────────────────────────
  let yM = Math.max(0, y - (desglose.length+4)*14 - 16);
  yM = secHeader(doc, 24+midW+12, yM + (desglose.length+4)*14+16 - (mes.length+2)*14 - 16, midW, 'TOP MESEROS');
  const mesActual = Array.isArray(mes) ? mes : [];
  yM = tableRow(doc, 24+midW+12, yM, [
    {v:'#',w:22,bold:true},{v:'MESERO',w:midW*0.45,bold:true},{v:'VENTA',w:midW*0.30,align:'right',bold:true},{v:'CTAS',w:midW*0.16,align:'right',bold:true}
  ], true);
  const top5 = mesActual.slice(0,5);
  top5.forEach((m,i) => {
    yM = tableRow(doc, 24+midW+12, yM, [
      {v:String(i+1),  w:22},
      {v:m.idmesero||m.nombre||'—', w:midW*0.45},
      {v:fmt(m.venta||0), w:midW*0.30, align:'right', bold:true},
      {v:String(m.tickets||m.cuentas||0), w:midW*0.16, align:'right'},
    ], false, i%2===0);
  });
  if (!top5.length) { fill(doc,GRAY); doc.font('Helvetica').fontSize(7).text('Sin datos de meseros', 24+midW+16, yM+4); yM+=14; }

  y = Math.max(y, yM) + 10;

  // ── Comparativo con periodo anterior ──────────────────────────────────────
  y = secHeader(doc, 24, y, PW, 'COMPARATIVO CON PERIODO ANTERIOR');
  y = tableRow(doc, 24, y, [
    {v:'CONCEPTO',w:PW*0.28,bold:true},{v:'PERIODO ACTUAL',w:PW*0.24,align:'right',bold:true},
    {v:'PERIODO ANTERIOR',w:PW*0.24,align:'right',bold:true},{v:'VARIACION',w:PW*0.24,align:'right',bold:true}
  ], true);

  const compRows = [
    ['Venta total', fmt(venta), fmt(a.venta_total||0), varPct!==null?(varPct>=0?'+':'')+varPct.toFixed(1)+'%':'N/D'],
    ['Tickets (cuentas)', String(tickets), String(a.tickets||0), tickets&&a.tickets?((tickets-a.tickets)/a.tickets*100).toFixed(1)+'%':'N/D'],
    ['Ticket promedio', fmt(ticketProm), fmt(a.tickets>0?a.venta_total/a.tickets:0), ''],
    ['Alimentos', fmt(alim), fmt(a.alimentos||0), alim&&a.alimentos?((alim-a.alimentos)/a.alimentos*100).toFixed(1)+'%':'N/D'],
    ['Bebidas', fmt(beb), fmt(a.bebidas||0), beb&&a.bebidas?((beb-a.bebidas)/a.bebidas*100).toFixed(1)+'%':'N/D'],
  ];
  compRows.forEach((r,i) => {
    y = tableRow(doc, 24, y, [
      {v:r[0],w:PW*0.28},{v:r[1],w:PW*0.24,align:'right',bold:true},
      {v:r[2],w:PW*0.24,align:'right'},{v:r[3],w:PW*0.24,align:'right',bold:true}
    ], false, i%2===0);
  });
  y += 8;

  // ── Pie de pagina pag 1 ───────────────────────────────────────────────────
  fill(doc, GRAY);
  doc.font('Helvetica').fontSize(6.5).text(
    `ARKHON — Generado: ${new Date().toLocaleString('es-MX')} — Pagina 1`,
    0, 820, {width:595, align:'center'}
  );

  // ══════════════════════════════════════════════════
  // PAGINA 2 — DETALLE POR DIA + RESUMEN CAJA
  // ══════════════════════════════════════════════════
  doc.addPage();
  pageHeader(doc, negocio, periodo, 'DETALLE POR DIA / CAJA');
  y = 58;

  // ── Ventas por dia ────────────────────────────────────────────────────────
  if (vpd.length) {
    const maxVenta = vpd.reduce((m,d)=>Math.max(m,d.venta||0),1);
    y = secHeader(doc, 24, y, PW, 'VENTAS POR DIA');
    y = tableRow(doc, 24, y, [
      {v:'FECHA',w:PW*0.18,bold:true},{v:'DIA',w:PW*0.13,bold:true},
      {v:'TICKETS',w:PW*0.12,align:'right',bold:true},
      {v:'VENTA',w:PW*0.20,align:'right',bold:true},
      {v:'T.PROM.',w:PW*0.17,align:'right',bold:true},
      {v:'GRAFICO',w:PW*0.20,bold:true}
    ], true);
    const dias_semana = ['Dom','Lun','Mar','Mie','Jue','Vie','Sab'];
    vpd.forEach((d,i) => {
      const dia = d.fecha ? dias_semana[new Date(d.fecha+'T12:00').getDay()] : '';
      const tp  = (d.tickets||0)>0 ? d.venta/(d.tickets||1) : 0;
      y = tableRow(doc, 24, y, [
        {v:String(d.fecha||''),  w:PW*0.18},
        {v:dia,                  w:PW*0.13},
        {v:String(d.tickets||0), w:PW*0.12, align:'right'},
        {v:fmt(d.venta||0),      w:PW*0.20, align:'right', bold:true},
        {v:fmt(tp),              w:PW*0.17, align:'right'},
        {v:'',                   w:PW*0.20},
      ], false, i%2===0);
      barH(doc, 24+PW*0.80+4, y-10, PW*0.18-8, d.venta||0, maxVenta, ORANGE);
    });
    // Total
    cellBg(doc, 24, y, PW, 14, '#FFF7ED');
    fill(doc,DARK);
    doc.font('Helvetica-Bold').fontSize(7.5).text('TOTAL DEL PERIODO', 28, y+3);
    doc.font('Helvetica-Bold').fontSize(7.5).text(fmt(venta), 24, y+3, {width:PW-8, align:'right', lineBreak:false});
    y += 20;
  }

  // ── Caja: formas de pago detallada ────────────────────────────────────────
  const halfW2 = (PW - 12) / 2;
  y = secHeader(doc, 24, y, halfW2, 'RESUMEN DE CAJA');
  const cajaRows = [
    {label:'EFECTIVO',   val:fp.find(p=>(p.forma_pago||'').toLowerCase().includes('efectivo'))?.total||0, color:GREEN},
    {label:'TARJETA',    val:fp.filter(p=>{const n=(p.forma_pago||'').toLowerCase();return n.includes('tarjeta')||n.includes('debito')||n.includes('credito');}).reduce((s,p)=>s+(p.total||0),0), color:BLUE},
    {label:'VALES',      val:fp.find(p=>(p.forma_pago||'').toLowerCase().includes('vale'))?.total||0, color:ORANGE},
    {label:'OTROS',      val:fp.filter(p=>{const n=(p.forma_pago||'').toLowerCase();return !n.includes('efectivo')&&!n.includes('tarjeta')&&!n.includes('debito')&&!n.includes('credito')&&!n.includes('vale');}).reduce((s,p)=>s+(p.total||0),0), color:GRAY},
  ];
  cajaRows.forEach((r,i) => {
    y = tableRow(doc, 24, y, [
      {v:r.label, w:halfW2*0.50}, {v:fmt(r.val), w:halfW2*0.50, align:'right', bold:true}
    ], false, i%2===0);
  });
  hline(doc, 24, y, halfW2, LGRAY);
  y = tableRow(doc, 24, y, [
    {v:'TOTAL', w:halfW2*0.50, bold:true},
    {v:fmt(cajaRows.reduce((s,r)=>s+r.val,0)), w:halfW2*0.50, align:'right', bold:true}
  ], false, false);
  y += 10;

  // ── Estadisticas de tickets ───────────────────────────────────────────────
  let yS = 58 + 16 + (vpd.length ? (vpd.length+2)*14+20 : 0);
  yS = secHeader(doc, 24+halfW2+12, yS, halfW2, 'ESTADISTICAS');
  const statsRows = [
    ['Total cuentas',      String(tickets)],
    ['Ticket promedio',    fmt(ticketProm)],
    ['Venta con imp.',     fmt(venta)],
    ['Descuentos',         fmt(desctos)],
    ['Propinas',           fmt(propinas)],
    ['Impuesto',           fmt(impuesto)],
    ['Cortesias',          String(t.cortesias||0)],
    ['Dias con venta',     String(dias)],
    ['Venta diaria prom.', fmt(dias>0?venta/dias:0)],
  ];
  statsRows.forEach((r,i) => {
    yS = tableRow(doc, 24+halfW2+12, yS, [
      {v:r[0], w:halfW2*0.58}, {v:r[1], w:halfW2*0.42, align:'right', bold:true}
    ], false, i%2===0);
  });

  // ── Pie pag 2 ─────────────────────────────────────────────────────────────
  fill(doc, GRAY);
  doc.font('Helvetica').fontSize(6.5).text(
    `ARKHON — Generado: ${new Date().toLocaleString('es-MX')} — Pagina 2`,
    0, 820, {width:595, align:'center'}
  );

  // ══════════════════════════════════════════════════
  // PAGINA 3 — VENTAS POR HORA + TOP PRODUCTOS
  // ══════════════════════════════════════════════════
  if (data.ventasHora && data.ventasHora.length > 0) {
    doc.addPage();
    pageHeader(doc, negocio, periodo, 'VENTAS POR HORA');
    y = 58;

    const vph = (data.ventasHora||[]).filter(h=>(h.venta||0)>0).sort((a,b)=>Number(a.hora)-Number(b.hora));
    const hMax = vph.reduce((m,h)=>Math.max(m,h.venta||0),1);

    y = secHeader(doc, 24, y, PW, 'DISTRIBUCION DE VENTAS POR HORA');
    y = tableRow(doc, 24, y, [
      {v:'HORA',w:70,bold:true},{v:'TICKETS',w:70,align:'right',bold:true},
      {v:'VENTA',w:100,align:'right',bold:true},
      {v:'% DEL DIA',w:80,align:'right',bold:true},
      {v:'GRAFICO',w:PW-320,bold:true}
    ], true);

    const picHora = vph.length ? vph.reduce((mx,h)=>h.venta>mx.venta?h:mx,vph[0]) : null;
    vph.forEach((h,i) => {
      const esPico = picHora && h.hora === picHora.hora;
      if (esPico) cellBg(doc, 24, y, PW, 14, '#FFF7ED');
      else if (i%2===0) cellBg(doc, 24, y, PW, 14, '#F9FAFB');

      fill(doc, DARK);
      doc.font(esPico?'Helvetica-Bold':'Helvetica').fontSize(7.5);
      doc.text(String(h.hora).padStart(2,'0')+':00 hrs', 28, y+3, {width:62, lineBreak:false});
      doc.font('Helvetica').fontSize(7.5).text(String(h.tickets||0), 94, y+3, {width:62, align:'right', lineBreak:false});
      doc.font('Helvetica-Bold').fontSize(7.5).text(fmt(h.venta||0), 164, y+3, {width:96, align:'right', lineBreak:false});
      doc.font('Helvetica').fontSize(7.5).text(pct(h.venta||0,venta), 264, y+3, {width:76, align:'right', lineBreak:false});
      barH(doc, 344, y+3, PW-326, h.venta||0, hMax, esPico?ORANGE:BLUE);
      hline(doc, 24, y+14, PW, LGRAY);
      y += 14;
    });

    // Total
    cellBg(doc, 24, y, PW, 14, '#FFF7ED');
    fill(doc, DARK);
    doc.font('Helvetica-Bold').fontSize(7.5).text('TOTAL DEL DIA', 28, y+3);
    doc.font('Helvetica-Bold').fontSize(7.5).text(fmt(venta), 24, y+3, {width:PW, align:'right', lineBreak:false});
    y += 20;

    if (picHora) {
      fill(doc, GRAY);
      doc.font('Helvetica').fontSize(7)
         .text(`Hora pico: ${String(picHora.hora).padStart(2,'0')}:00 hrs con ${fmt(picHora.venta)} (${pct(picHora.venta,venta)} del dia)`, 24, y);
      y += 14;
    }

    // Pie pag 3
    fill(doc, GRAY);
    doc.font('Helvetica').fontSize(6.5).text(
      `ARKHON — Generado: ${new Date().toLocaleString('es-MX')} — Pagina 3`,
      0, 820, {width:595, align:'center'}
    );
  }

  doc.end();
}

module.exports = { generarPDF };
