import PDFDocument from "pdfkit";
import type { Response } from "express";
import { PdfHeader } from "./components/PdfHeader.js";

const COLORS = {
  primary: "#0F5132",
  accent: "#198754",
  text: "#212529",
  muted: "#6C757D",
  border: "#DEE2E6",
  rowAlt: "#F8F9FA",
  white: "#FFFFFF",
  highlight: "#D1E7DD",
};

const PAGE_MARGIN = 40;

function fmt(value: number | string | undefined | null): string {
  const n = Number(value ?? 0);
  return isNaN(n) ? "0.00" : n.toLocaleString("en-IN", { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}

function fmtDate(date: any): string {
  if (!date) return "-";
  const d = new Date(date);
  return isNaN(d.getTime()) ? "-" : d.toLocaleDateString("en-IN", { day: "2-digit", month: "2-digit", year: "numeric" });
}

export class ArrivalSettlementPdf {
  static async generate(settlement: any, res: Response) {
    const doc = new PDFDocument({
      size: "A4",
      margin: PAGE_MARGIN,
      bufferPages: true,
    });

    res.setHeader("Content-Type", "application/pdf");
    res.setHeader(
      "Content-Disposition",
      `attachment; filename="patti-settlement-${settlement.settlementNo}.pdf"`
    );
    res.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
    doc.pipe(res);

    const pageWidth = doc.page.width - PAGE_MARGIN * 2;

    await PdfHeader.draw(doc, pageWidth, PAGE_MARGIN, "COMMISSION PATTI SETTLEMENT");

    let currentY = doc.y + 10;

    // Patti Info Header Card
    doc.rect(PAGE_MARGIN, currentY, pageWidth, 75).fillAndStroke("#F8F9FA", COLORS.border);
    doc.fillColor(COLORS.text).fontSize(9);

    const col1 = PAGE_MARGIN + 10;
    const col2 = PAGE_MARGIN + pageWidth / 2 + 10;

    const arrival = settlement.purchase || {};
    const supplierName = arrival.supplier?.name || arrival.cashSupplierName || arrival.agentName || "Farmer";
    const vegName = arrival.vegetable?.name || "Vegetables";

    doc.font("Helvetica-Bold").text(`Patti No: ${settlement.settlementNo}`, col1, currentY + 10);
    doc.font("Helvetica").text(`Settlement Date: ${fmtDate(settlement.settlementDate)}`, col1, currentY + 25);
    doc.text(`Farmer / Supplier: ${supplierName}`, col1, currentY + 40);
    doc.text(`Truck No: ${arrival.truckNo || "-"}`, col1, currentY + 55);

    doc.font("Helvetica-Bold").text(`Lot No: ${arrival.lotNo} (${vegName})`, col2, currentY + 10);
    doc.font("Helvetica").text(`Arrival Date: ${fmtDate(arrival.arrivalDate)}`, col2, currentY + 25);
    doc.text(`Received Qty: ${fmt(arrival.quantity)} KG (${Number(arrival.bags || 0)} Bags)`, col2, currentY + 40);
    doc.text(`Status: ${settlement.status}`, col2, currentY + 55);

    currentY += 90;

    // Section 1: Sales Realization Table
    doc.font("Helvetica-Bold").fontSize(10).fillColor(COLORS.primary).text("SALES REALIZATION BREAKDOWN", PAGE_MARGIN, currentY);
    currentY += 15;

    const wholesaleItems = (arrival.saleItems || []).map((item: any) => ({
      date: item.sale?.invoiceDate,
      invoiceNo: item.sale?.invoiceNo || "-",
      buyer: item.sale?.customer?.name || item.sale?.walkInName || "Wholesale Buyer",
      channel: "Wholesale",
      quantity: item.quantity,
      sellingRate: item.sellingRate,
      total: item.total,
      createdAt: item.createdAt,
    }));

    const retailItems: any[] = [];
    (arrival.retailStocks || []).forEach((rs: any) => {
      (rs.retailSaleItems || []).forEach((rsi: any) => {
        retailItems.push({
          date: rsi.retailSale?.invoiceDate,
          invoiceNo: rsi.retailSale?.invoiceNo || "-",
          buyer: rsi.retailSale?.walkInName || "Retail Walk-in",
          channel: "Retail",
          quantity: rsi.quantity,
          sellingRate: rsi.sellingRate,
          total: rsi.total,
          createdAt: rsi.createdAt,
        });
      });
    });

    const allSaleItems = [...wholesaleItems, ...retailItems].sort(
      (a: any, b: any) => new Date(a.date || a.createdAt).getTime() - new Date(b.date || b.createdAt).getTime()
    );

    const tableTop = currentY;

    // Header
    doc.rect(PAGE_MARGIN, tableTop, pageWidth, 20).fill(COLORS.primary);
    doc.fillColor(COLORS.white).font("Helvetica-Bold").fontSize(8);
    doc.text("Date", PAGE_MARGIN + 5, tableTop + 6, { width: 55 });
    doc.text("Invoice #", PAGE_MARGIN + 62, tableTop + 6, { width: 85 });
    doc.text("Type", PAGE_MARGIN + 150, tableTop + 6, { width: 55 });
    doc.text("Buyer", PAGE_MARGIN + 210, tableTop + 6, { width: 100 });
    doc.text("Quantity (KG)", PAGE_MARGIN + 315, tableTop + 6, { width: 65, align: "right" });
    doc.text("Rate / KG", PAGE_MARGIN + 385, tableTop + 6, { width: 60, align: "right" });
    doc.text("Total (Rs)", PAGE_MARGIN + 450, tableTop + 6, { width: 65, align: "right" });

    currentY = tableTop + 20;

    doc.font("Helvetica").fontSize(8).fillColor(COLORS.text);
    allSaleItems.forEach((item: any, idx: number) => {
      const isAlt = idx % 2 === 1;
      if (isAlt) {
        doc.rect(PAGE_MARGIN, currentY, pageWidth, 18).fill("#F8F9FA");
      }
      doc.fillColor(COLORS.text);
      doc.text(fmtDate(item.date), PAGE_MARGIN + 5, currentY + 5, { width: 55 });
      doc.text(item.invoiceNo || "-", PAGE_MARGIN + 62, currentY + 5, { width: 85 });
      doc.text(item.channel || "Wholesale", PAGE_MARGIN + 150, currentY + 5, { width: 55 });
      doc.text(item.buyer || "Buyer", PAGE_MARGIN + 210, currentY + 5, { width: 100 });
      doc.text(fmt(item.quantity), PAGE_MARGIN + 315, currentY + 5, { width: 65, align: "right" });
      doc.text(`Rs. ${fmt(item.sellingRate)}`, PAGE_MARGIN + 385, currentY + 5, { width: 60, align: "right" });
      doc.text(`Rs. ${fmt(item.total)}`, PAGE_MARGIN + 450, currentY + 5, { width: 65, align: "right" });
      currentY += 18;
    });

    // Subtotal Row
    doc.rect(PAGE_MARGIN, currentY, pageWidth, 20).fill("#E9ECEF");
    doc.font("Helvetica-Bold").fillColor(COLORS.text);
    doc.text("Total Sold Realization:", PAGE_MARGIN + 5, currentY + 6, { width: 300 });
    doc.text(`${fmt(settlement.totalWeightSold)} KG`, PAGE_MARGIN + 315, currentY + 6, { width: 65, align: "right" });
    doc.text(`Rs. ${fmt(settlement.grossSalesTotal)}`, PAGE_MARGIN + 450, currentY + 6, { width: 65, align: "right" });

    currentY += 30;

    // Section 2: Commission & Deductions Box
    doc.font("Helvetica-Bold").fontSize(10).fillColor(COLORS.primary).text("SETTLEMENT & DEDUCTIONS SUMMARY", PAGE_MARGIN, currentY);
    currentY += 15;

    const summaryBoxY = currentY;
    doc.rect(PAGE_MARGIN, summaryBoxY, pageWidth, 149).stroke(COLORS.border);

    const leftColX = PAGE_MARGIN + 15;
    const rightColX = PAGE_MARGIN + pageWidth - 140;

    doc.font("Helvetica").fontSize(9).fillColor(COLORS.text);

    let rowY = summaryBoxY + 10;
    doc.text("Gross Vegetable Sales Realized:", leftColX, rowY);
    doc.font("Helvetica-Bold").text(`Rs. ${fmt(settlement.grossSalesTotal)}`, rightColX, rowY, { align: "right", width: 125 });

    rowY += 16;
    doc.font("Helvetica").text(`Commission Deducted (${fmt(settlement.commissionPercent)}%):`, leftColX, rowY);
    doc.fillColor("#DC3545").text(`- Rs. ${fmt(settlement.commissionAmount)}`, rightColX, rowY, { align: "right", width: 125 });

    rowY += 16;
    doc.fillColor(COLORS.text).text("Freight:", leftColX, rowY);
    doc.fillColor("#DC3545").text(`- Rs. ${fmt(settlement.freightDeducted)}`, rightColX, rowY, { align: "right", width: 125 });

    rowY += 16;
    doc.fillColor(COLORS.text).text("Extra Freight:", leftColX, rowY);
    doc.fillColor("#DC3545").text(`- Rs. ${fmt(settlement.extraFreightDeducted)}`, rightColX, rowY, { align: "right", width: 125 });

    rowY += 16;
    doc.fillColor(COLORS.text).text("Unloading / Coolie:", leftColX, rowY);
    doc.fillColor("#DC3545").text(`- Rs. ${fmt(settlement.unloadingDeducted)}`, rightColX, rowY, { align: "right", width: 125 });

    rowY += 16;
    doc.fillColor(COLORS.text).text("Association Fee:", leftColX, rowY);
    doc.fillColor("#DC3545").text(`- Rs. ${fmt(settlement.associationDeducted)}`, rightColX, rowY, { align: "right", width: 125 });

    rowY += 16;
    doc.fillColor(COLORS.text).text("Misc Fee:", leftColX, rowY);
    doc.fillColor("#DC3545").text(`- Rs. ${fmt(settlement.miscDeducted)}`, rightColX, rowY, { align: "right", width: 125 });

    rowY += 20;
    // Highlight Net Payable
    doc.rect(PAGE_MARGIN + 5, rowY - 4, pageWidth - 10, 22).fill(COLORS.highlight);
    doc.font("Helvetica-Bold").fontSize(10).fillColor(COLORS.primary);
    doc.text("NET AMOUNT PAYABLE TO FARMER / SUPPLIER:", leftColX, rowY);
    doc.text(`Rs. ${fmt(settlement.netPayable)}`, rightColX, rowY, { align: "right", width: 125 });

    currentY = summaryBoxY + 180;

    // Signatures
    doc.font("Helvetica").fontSize(9).fillColor(COLORS.muted);
    doc.text("Farmer / Supplier Signature", PAGE_MARGIN + 20, currentY + 30);
    doc.text("For Amman Vegetable Stores", PAGE_MARGIN + pageWidth - 160, currentY + 30);

    doc.end();
  }
}
