import { Invoice } from "@/redux/api/invoiceApi";

export async function downloadInvoicePDF(invoice: Invoice): Promise<void> {
  // Use browser-friendly UMD bundle so we don't pull in the Node worker build
  const { jsPDF } = await import("jspdf/dist/jspdf.umd.min.js");
  const doc = new jsPDF();
  
  const formatDate = (dateString: string) => {
    return new Date(dateString).toLocaleDateString('en-US', {
      year: 'numeric',
      month: 'long',
      day: 'numeric'
    });
  };

  const formatCurrency = (amount: number) => {
    return `INR ${amount.toLocaleString('en-IN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
  };

  // Colors
  const primaryColor: [number, number, number] = [41, 128, 185];
  const secondaryColor: [number, number, number] = [52, 73, 94];
  const lightGray: [number, number, number] = [236, 240, 241];

  // Header
  doc.setFillColor(...primaryColor);
  doc.rect(0, 0, 210, 35, 'F');
  
  doc.setTextColor(255, 255, 255);
  doc.setFontSize(24);
  doc.setFont('helvetica', 'bold');
  doc.text('INVOICE', 20, 25);

  if (invoice.company?.name) {
    doc.setFontSize(12);
    doc.setFont('helvetica', 'normal');
    doc.text(invoice.company.name, 150, 20);
    if (invoice.company.websiteUrl) {
      doc.setFontSize(10);
      doc.text(invoice.company.websiteUrl, 150, 28);
    }
  }

  // Invoice Details
  doc.setTextColor(0, 0, 0);
  doc.setFillColor(...lightGray);
  doc.rect(20, 45, 170, 25, 'F');
  
  doc.setFontSize(14);
  doc.setFont('helvetica', 'bold');
  doc.setTextColor(...secondaryColor);
  doc.text('Invoice Details', 25, 60);

  doc.setFontSize(11);
  doc.setFont('helvetica', 'normal');
  doc.setTextColor(0, 0, 0);
  
  const invoiceDetails = [
    [`Invoice Number:`, `#${invoice.invoiceNumber}`],
    [`Issue Date:`, formatDate(invoice.issuedDate)],
    [`Due Date:`, formatDate(invoice.dueDate)],
    [`Status:`, invoice.status.toUpperCase()]
  ];

  let yPos = 80;
  invoiceDetails.forEach(([label, value]) => {
    doc.setFont('helvetica', 'bold');
    doc.text(label, 25, yPos);
    doc.setFont('helvetica', 'normal');
    doc.text(value, 80, yPos);
    yPos += 8;
  });

  // Status badge
  const statusColors: { [key: string]: [number, number, number] } = {
    'paid': [46, 204, 113],
    'unpaid': [231, 76, 60],
    'overdue': [230, 126, 34]
  };
  
  doc.setFillColor(...(statusColors[invoice.status] || [149, 165, 166] as [number, number, number]));
  doc.roundedRect(150, 75, 35, 12, 2, 2, 'F');
  doc.setTextColor(255, 255, 255);
  doc.setFontSize(9);
  doc.setFont('helvetica', 'bold');
  doc.text(invoice.status.toUpperCase(), 167, 83, { align: 'center' });

  // Bill To
  doc.setTextColor(...secondaryColor);
  doc.setFontSize(14);
  doc.setFont('helvetica', 'bold');
  doc.text('Bill To:', 25, 130);

  doc.setTextColor(0, 0, 0);
  doc.setFontSize(12);
  doc.setFont('helvetica', 'normal');
  doc.text(invoice.company?.name || 'Company Name', 25, 145);

  // Service Details
  doc.setFillColor(...lightGray);
  doc.rect(20, 160, 170, 10, 'F');
  
  doc.setTextColor(...secondaryColor);
  doc.setFontSize(12);
  doc.setFont('helvetica', 'bold');
  doc.text('Service Details', 25, 168);

  // Table
  const tableHeaders = ['Description', 'Users', 'Validity', 'Amount'];
  const columnWidths = [80, 30, 35, 35];
  let xPos = 25;
  
  doc.setFillColor(...primaryColor);
  doc.rect(20, 175, 170, 12, 'F');
  
  doc.setTextColor(255, 255, 255);
  doc.setFontSize(10);
  doc.setFont('helvetica', 'bold');
  
  tableHeaders.forEach((header, index) => {
    doc.text(header, xPos, 183);
    xPos += columnWidths[index];
  });

  doc.setTextColor(0, 0, 0);
  doc.setFontSize(10);
  doc.setFont('helvetica', 'normal');
  
  const validityText = invoice.planValidity 
    ? `${invoice.planValidity.validfor} ${invoice.planValidity.validUnit}`
    : 'N/A';

  const tableData = [
    'Subscription Plan',
    invoice.maxUserCount?.toString() || 'N/A',
    validityText,
    formatCurrency(invoice.price)
  ];

  xPos = 25;
  tableData.forEach((data, index) => {
    doc.text(data, xPos, 195);
    xPos += columnWidths[index];
  });

  // Pricing
  const pricingY = 220;
  doc.setDrawColor(...lightGray);
  doc.line(120, pricingY - 5, 190, pricingY - 5);

  // Calculate plan validity in months
  let planValidityInMonths = 1;
  if (invoice.planValidity) {
    const planValidity = invoice.planValidity.validfor;
    const planValidityUnit = invoice.planValidity.validUnit;
    
    switch (planValidityUnit) {
      case "days":
        planValidityInMonths = planValidity / 30;
        break;
      case "years":
        planValidityInMonths = planValidity * 12;
        break;
      case "months":
      default:
        planValidityInMonths = planValidity;
        break;
    }
  }

  const totalAmount = invoice.price * planValidityInMonths * Number(invoice.maxUserCount);

  const pricingDetails = [
    ['Price per month:', formatCurrency(invoice.price)],
    ['Duration:', `${planValidityInMonths} month${planValidityInMonths !== 1 ? 's' : ''}`],
    ['Subtotal:', formatCurrency(totalAmount)],
    ...(invoice.tax ? [['Tax:', `${invoice.tax}% (${formatCurrency((totalAmount * invoice.tax) / 100)})`]] : []),
    ...(invoice.discount ? [['Discount:', `-${invoice.discount}% (${formatCurrency((totalAmount * invoice.discount) / 100)})`]] : [])
  ];

  let pricingYPos = pricingY;
  pricingDetails.forEach(([label, value]) => {
    doc.setFont('helvetica', 'normal');
    doc.text(label, 120, pricingYPos);
    doc.text(value, 190, pricingYPos, { align: 'right' });
    pricingYPos += 8;
  });

  // Total
  doc.setFillColor(...primaryColor);
  doc.rect(120, pricingYPos + 2, 70, 15, 'F');
  
  doc.setTextColor(255, 255, 255);
  doc.setFont('helvetica', 'bold');
  doc.setFontSize(12);
  doc.text('Total:', 125, pricingYPos + 12);
  doc.text(formatCurrency(invoice.finalPrice), 185, pricingYPos + 12, { align: 'right' });

  // Notes
  if (invoice.note && invoice.note.trim()) {
    doc.setTextColor(0, 0, 0);
    doc.setFontSize(10);
    doc.setFont('helvetica', 'bold');
    doc.text('Notes:', 25, pricingYPos + 30);
    
    doc.setFont('helvetica', 'normal');
    const noteLines = doc.splitTextToSize(invoice.note, 165);
    doc.text(noteLines, 25, pricingYPos + 40);
  }

  // Footer
  doc.setTextColor(128, 128, 128);
  doc.setFontSize(8);
  doc.setFont('helvetica', 'italic');
  doc.text('Thank you for your business!', 105, 280, { align: 'center' });

  // Download
  doc.save(`invoice_${invoice.invoiceNumber}.pdf`);
}