// NFe-style PDF generator helpers (reutilizável)
// Exige jsPDF (window.jspdf.jsPDF) já carregado

(function(){
  function formatBRL(v){
    const n = Number(v||0);
    return n.toLocaleString('pt-BR', { style:'currency', currency:'BRL' });
  }
  function formatDate(d){
    const dt = d ? new Date(d) : new Date();
    const dd = String(dt.getDate()).padStart(2,'0');
    const mm = String(dt.getMonth()+1).padStart(2,'0');
    const yy = dt.getFullYear();
    return `${dd}/${mm}/${yy}`;
  }
  function onlyDigits(s){ return String(s||'').replace(/\D+/g,''); }
  function formatCnpjCpf(v){
    const s = onlyDigits(v);
    if (s.length === 11) { return s.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/,'$1.$2.$3-$4'); }
    if (s.length === 14) { return s.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/,'$1.$2.$3/$4-$5'); }
    return v || '';
  }
  function safe(v, fallback='-'){ return (v===undefined||v===null||v==='') ? fallback : String(v); }

  // Desenha um layout semelhante à NF-e (cabeçalho, dados cliente, detalhes, itens, totais, rodapé)
  function drawNFe(doc, payload){
    const mm = 1; // unidade
    const pageW = 210; const pageH = 297; // A4 retrato mm
    const margin = 10;
    let y = margin;
    doc.setFont('helvetica',''); doc.setFontSize(10);

    // Cabeçalho com logo/nome + dados cadastrais
    const comp = payload.company || {};
    const compName = safe(comp.razao_social || comp.name || 'Minha Empresa');
    // Moldura do cabeçalho
    doc.setDrawColor(200); doc.setLineWidth(0.3);
    doc.rect(margin, y, pageW - margin*2, 30);
    // Logo (placeholder: um retângulo centralizado)
    const headerCenterX = pageW/2;
    doc.setFontSize(12); doc.setTextColor(40);
    doc.text(compName, headerCenterX, y+8, { align: 'center' });
    doc.setFontSize(9); doc.setTextColor(80);
    const compLine1 = `${safe(comp.logradouro)}${comp.numero?`, ${comp.numero}`:''}${comp.bairro?` - ${comp.bairro}`:''}`;
    const compLine2 = `${safe(comp.cidade)}/${safe(comp.estado)} - CEP ${safe(comp.cep)}`;
    const compId = `${comp.cnpj?`CNPJ: ${formatCnpjCpf(comp.cnpj)}`:''}${comp.ie?`  •  IE: ${comp.ie}`:''}`.trim();
    const compContact = `${safe(comp.telefone||'')}${comp.contact_email?`  •  ${comp.contact_email}`:''}${comp.site?`  •  ${comp.site}`:''}`.trim();
    doc.text(compLine1, headerCenterX, y+14, { align: 'center' });
    doc.text(compLine2, headerCenterX, y+19, { align: 'center' });
    if (compId) doc.text(compId, headerCenterX, y+24, { align: 'center' });
    if (compContact) doc.text(compContact, headerCenterX, y+29, { align: 'center' });
    y += 34;

    // Dados do cliente
    const cli = payload.client || {};
    doc.rect(margin, y, pageW - margin*2, 26);
    doc.setFontSize(10); doc.setTextColor(30);
    doc.text('Destinatário/Remetente', margin+2, y+5);
    doc.setFontSize(9); doc.setTextColor(60);
    const linha1 = `${safe(cli.nome || cli.razao_social || 'Cliente')}`;
    const end1 = `${safe(cli.logradouro)}${cli.numero?`, ${cli.numero}`:''}${cli.complemento?` - ${cli.complemento}`:''}`;
    const end2 = `${safe(cli.bairro)} - ${safe(cli.cidade)}/${safe(cli.estado)} - CEP ${safe(cli.cep)}`;
    const ids  = `${cli.cnpj?`CNPJ: ${formatCnpjCpf(cli.cnpj)}`: (cli.cpf?`CPF: ${formatCnpjCpf(cli.cpf)}`:'')}${cli.ie?`  •  IE: ${cli.ie}`:''}`.trim();
    doc.text(linha1, margin+2, y+11);
    doc.text(end1, margin+2, y+16);
    doc.text(end2, margin+2, y+21);
    if (ids) doc.text(ids, margin+2, y+26);
    y += 31;

    // Detalhes do documento
    const detH = 20;
    doc.rect(margin, y, pageW - margin*2, detH);
    const det = payload.details || {};
    const colW = (pageW - margin*2) / 3;
    doc.setFontSize(10); doc.setTextColor(30);
    doc.text('Documento', margin+2, y+5);
    doc.text('Emissão', margin+2+colW, y+5);
    doc.text('Pagamento', margin+2+colW*2, y+5);
    doc.setFontSize(9); doc.setTextColor(60);
    doc.text(safe(det.numero), margin+2, y+11);
    doc.text(safe(det.emissao || formatDate()), margin+2+colW, y+11);
    doc.text(safe(det.pagamento || 'A combinar'), margin+2+colW*2, y+11);
    if (det.validade) doc.text(`Validade: ${safe(det.validade)}`, margin+2+colW*2, y+16);
    y += detH + 5;

    // Tabela de produtos
    const cols = [
      { k: 'codigo', label: 'Código', w: 24, align:'left' },
      { k: 'descricao', label: 'Descrição', w: 86, align:'left' },
      { k: 'un', label: 'Unid.', w: 14, align:'right' },
      { k: 'qtd', label: 'Quantidade', w: 24, align:'right' },
      { k: 'unit', label: 'Vlr. Unitário', w: 26, align:'right' },
      { k: 'total', label: 'Vlr. Total', w: 26, align:'right' },
    ];
    const tableW = cols.reduce((a,c)=>a+c.w,0);
    doc.setFontSize(10); doc.setTextColor(30);
    doc.text('Produtos/Serviços', margin+2, y);
    y += 2;
    // Header da tabela
    doc.setLineWidth(0.2); doc.setDrawColor(180);
    doc.rect(margin, y, tableW, 8);
    let x = margin;
    doc.setFontSize(9); doc.setTextColor(50); doc.setFont(undefined,'bold');
    cols.forEach(c => { doc.text(c.label, x + (c.align==='right'?c.w-2:2), y+5, { align: c.align }); x += c.w; });
    doc.setFont(undefined,''); y += 8;
    // Linhas
    const items = Array.isArray(payload.items)? payload.items : [];
    items.forEach((it, idx) => {
      if (y > pageH - 60) { // quebra próxima à base
        doc.addPage(); y = margin;
      }
      x = margin; doc.rect(margin, y, tableW, 7);
      const row = {
        codigo: safe(it.codigo || it.product_id || ''),
        descricao: safe(it.descricao || it.nome || ''),
        un: safe(it.un || 'UN'),
        qtd: String(Number(it.quantidade||it.qtd||0)),
        unit: formatBRL(it.preco||it.unit||0),
        total: formatBRL(it.total||((it.preco||0)*(it.quantidade||0)))
      };
      cols.forEach(c => { doc.text(String(row[c.k]||''), x + (c.align==='right'?c.w-2:2), y+5, { align: c.align }); x += c.w; });
      y += 7;
    });
    y += 4;

    // Totais e observações
    const totals = payload.totals || {};
    const subtotal = Number(totals.subtotal || 0);
    const desconto = Number(totals.desconto || 0);
    const total = Number(totals.total || (subtotal - desconto));
    const rightBoxW = 70; const rightBoxH = 24;
    const leftBoxW = tableW - rightBoxW - 4; const leftBoxH = rightBoxH;
    // Observações
    doc.rect(margin, y, leftBoxW, leftBoxH);
    doc.setFontSize(10); doc.setTextColor(30); doc.text('Observações', margin+2, y+5);
    doc.setFontSize(9); doc.setTextColor(60);
    const obs = safe(payload.observacoes || 'Documento gerado pelo sistema GestorEasy.');
    doc.text(obs, margin+2, y+10, { maxWidth: leftBoxW-4 });
    // Totais
    const rx = margin + leftBoxW + 4;
    doc.rect(rx, y, rightBoxW, rightBoxH);
    doc.setFontSize(9); doc.setTextColor(40);
    doc.text(`Subtotal: ${formatBRL(subtotal)}`, rx+2, y+7);
    doc.text(`Descontos: ${formatBRL(desconto)}`, rx+2, y+13);
    doc.setFont(undefined,'bold'); doc.text(`Total: ${formatBRL(total)}`, rx+2, y+20);
    doc.setFont(undefined,'');
    y += rightBoxH + 6;

    // Composição tributária (IBS/CBS/IS) quando disponível
    const ibs = Number(totals.ibs_total || (payload.taxes ? payload.taxes.ibs_total : 0) || 0);
    const cbs = Number(totals.cbs_total || (payload.taxes ? payload.taxes.cbs_total : 0) || 0);
    const isv = Number(totals.is_total || (payload.taxes ? payload.taxes.is_total : 0) || 0);
    const hasNewTaxes = (ibs + cbs + isv) > 0;
    if (hasNewTaxes){
      const boxW = pageW - margin*2; const boxH = 16;
      doc.setDrawColor(180); doc.rect(margin, y, boxW, boxH);
      doc.setFontSize(10); doc.setTextColor(30);
      doc.text('Composição Tributária (2026)', margin+2, y+5);
      doc.setFontSize(9); doc.setTextColor(60);
      const line = `IBS: ${formatBRL(ibs)}   •   CBS: ${formatBRL(cbs)}   •   IS: ${formatBRL(isv)}`;
      doc.text(line, margin+2, y+11);
      y += boxH + 6;
    }

    // Rodapé com informações adicionais
    doc.setFontSize(9); doc.setTextColor(70);
    const addInfo = payload.info_adicionais || '';
    if (addInfo) { doc.text(addInfo, margin, pageH - margin - 4, { maxWidth: pageW - margin*2 }); }
  }

  window.NFePDF = { draw: drawNFe, formatBRL, formatDate, formatCnpjCpf };
})();