const PDFDocument = require('pdfkit');

const COLORS = {
  primary: '#1e40af',
  secondary: '#374151',
  light: '#f3f4f6',
  border: '#e5e7eb',
  text: '#111827',
  muted: '#6b7280',
};

async function generateInvoicePDF(invoice, companyId) {
  return new Promise((resolve, reject) => {
    const doc = new PDFDocument({ size: 'A4', margin: 50 });
    const buffers = [];
    doc.on('data', (chunk) => buffers.push(chunk));
    doc.on('end', () => resolve(Buffer.concat(buffers)));
    doc.on('error', reject);

    const contact = invoice.Contact || {};
    const lineItems = invoice.lineItems || invoice.InvoiceLineItems || [];

    // ─── Header ───────────────────────────────────────────────────────────────
    doc.rect(0, 0, 595, 100).fill(COLORS.primary);
    doc.fillColor('white').fontSize(26).font('Helvetica-Bold').text('INVOICE', 50, 30);
    doc.fontSize(11).font('Helvetica').text(`#${invoice.invoice_number}`, 50, 62);
    doc.fillColor('white').fontSize(10).text(`Date: ${formatDate(invoice.date)}`, 400, 30, { align: 'right', width: 145 });
    doc.text(`Due: ${formatDate(invoice.due_date)}`, 400, 48, { align: 'right', width: 145 });

    // Status badge
    const statusColors = { paid: '#16a34a', overdue: '#dc2626', partial: '#d97706', sent: '#2563eb', draft: '#6b7280', void: '#9ca3af' };
    const sColor = statusColors[invoice.status] || '#6b7280';
    doc.rect(450, 64, 90, 20).fill(sColor);
    doc.fillColor('white').fontSize(9).font('Helvetica-Bold').text(invoice.status.toUpperCase(), 450, 69, { width: 90, align: 'center' });

    // ─── From / To ────────────────────────────────────────────────────────────
    doc.fillColor(COLORS.muted).fontSize(8).font('Helvetica-Bold').text('FROM', 50, 120);
    doc.fillColor(COLORS.text).fontSize(10).font('Helvetica-Bold').text('Your Company', 50, 132);
    doc.font('Helvetica').fontSize(9).fillColor(COLORS.secondary).text('company@email.com', 50, 146);

    doc.fillColor(COLORS.muted).fontSize(8).font('Helvetica-Bold').text('BILL TO', 300, 120);
    doc.fillColor(COLORS.text).fontSize(10).font('Helvetica-Bold').text(contact.name || 'Customer', 300, 132);
    if (contact.email) doc.font('Helvetica').fontSize(9).fillColor(COLORS.secondary).text(contact.email, 300, 146);
    if (contact.billing_address) doc.text(contact.billing_address, 300, 160, { width: 245, lineBreak: true });

    // ─── Line Items Table ──────────────────────────────────────────────────────
    let y = 220;
    doc.rect(50, y, 495, 24).fill(COLORS.primary);
    doc.fillColor('white').fontSize(9).font('Helvetica-Bold');
    doc.text('DESCRIPTION', 60, y + 8);
    doc.text('QTY', 310, y + 8, { width: 50, align: 'right' });
    doc.text('UNIT PRICE', 365, y + 8, { width: 80, align: 'right' });
    doc.text('TAX', 445, y + 8, { width: 40, align: 'right' });
    doc.text('AMOUNT', 490, y + 8, { width: 55, align: 'right' });

    y += 24;
    let alternate = false;
    for (const item of lineItems) {
      if (y > 680) { doc.addPage(); y = 50; }
      if (alternate) doc.rect(50, y, 495, 20).fill(COLORS.light);
      doc.fillColor(COLORS.text).fontSize(9).font('Helvetica');
      doc.text(item.description || '', 60, y + 5, { width: 240 });
      doc.text(formatNum(item.qty), 310, y + 5, { width: 50, align: 'right' });
      doc.text(formatCurrency(item.unit_price), 365, y + 5, { width: 80, align: 'right' });
      doc.text(formatCurrency(item.tax_amount), 445, y + 5, { width: 40, align: 'right' });
      doc.text(formatCurrency(item.amount), 490, y + 5, { width: 55, align: 'right' });
      y += 20;
      alternate = !alternate;
    }

    // ─── Totals ───────────────────────────────────────────────────────────────
    y += 10;
    doc.moveTo(50, y).lineTo(545, y).strokeColor(COLORS.border).stroke();
    y += 10;
    const addRow = (label, value, bold = false) => {
      if (bold) { doc.font('Helvetica-Bold').fontSize(11); } else { doc.font('Helvetica').fontSize(9); }
      doc.fillColor(COLORS.secondary).text(label, 380, y, { width: 110, align: 'right' });
      doc.fillColor(bold ? COLORS.primary : COLORS.text).text(formatCurrency(value), 490, y, { width: 55, align: 'right' });
      y += bold ? 18 : 16;
    };
    addRow('Subtotal', invoice.subtotal);
    if (parseFloat(invoice.discount || 0) > 0) addRow('Discount', -invoice.discount);
    addRow('Tax', invoice.tax_total);
    doc.rect(375, y - 4, 170, 1).fill(COLORS.border);
    addRow('TOTAL DUE', invoice.balance_due, true);

    // ─── Notes ────────────────────────────────────────────────────────────────
    if (invoice.notes) {
      y += 20;
      doc.fillColor(COLORS.muted).fontSize(8).font('Helvetica-Bold').text('NOTES', 50, y);
      doc.fillColor(COLORS.secondary).fontSize(9).font('Helvetica').text(invoice.notes, 50, y + 12, { width: 300 });
    }

    // ─── Footer ───────────────────────────────────────────────────────────────
    doc.rect(0, 780, 595, 62).fill(COLORS.light);
    doc.fillColor(COLORS.muted).fontSize(8).text('Thank you for your business!', 50, 795, { align: 'center', width: 495 });

    doc.end();
  });
}

async function generateBillPDF(bill) {
  return generateInvoicePDF({ ...bill, invoice_number: bill.bill_number, lineItems: bill.lineItems }, null);
}

function formatDate(d) {
  if (!d) return 'N/A';
  return new Date(d).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: '2-digit' });
}
function formatCurrency(v) {
  return `$${parseFloat(v || 0).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
}
function formatNum(v) {
  return parseFloat(v || 0).toLocaleString('en-US', { maximumFractionDigits: 2 });
}

module.exports = { generateInvoicePDF, generateBillPDF };
