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

const COLORS = {
  primary: "#002060",
  secondary: "#1B5E20",
  accent: "#D32F2F",
  text: "#212529",
  border: "#DEE2E6",
  bgLight: "#F8F9FA",
};

const PAGE_MARGIN = 36;

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

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

    res.setHeader("Content-Type", "application/pdf");
    res.setHeader(
      "Content-Disposition",
      `attachment; filename="Final_Daily_Report_${data.date}.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, "FINAL DAILY REPORT");

    const startY = doc.y + 10;
    
    // Draw Date Badge
    doc.rect(PAGE_MARGIN, startY, pageWidth, 24).fillAndStroke(COLORS.bgLight, COLORS.border);
    doc
      .font("Helvetica-Bold")
      .fontSize(10)
      .fillColor(COLORS.primary)
      .text(`DATE : ${data.date} | FINAL DAILY REPORT`, PAGE_MARGIN + 10, startY + 6);

    let y = startY + 36;

    // Quick block drawing function
    const drawBlock = (title: string, lines: { label: string; value: string }[]) => {
      // Check if we need to add a new page
      if (y > doc.page.height - PAGE_MARGIN - 60) {
        doc.addPage();
        y = PAGE_MARGIN;
      }

      doc.font("Helvetica-Bold").fontSize(11).fillColor(COLORS.primary).text(title, PAGE_MARGIN, y);
      y += 16;

      doc.rect(PAGE_MARGIN, y, pageWidth, lines.length * 16 + 4).fillAndStroke("#FFFFFF", COLORS.border);
      y += 4;
      
      lines.forEach((line) => {
        doc.font("Helvetica").fontSize(9).fillColor(COLORS.text).text(line.label, PAGE_MARGIN + 8, y, { width: pageWidth / 2 });
        doc.font("Helvetica-Bold").fontSize(9).text(line.value, PAGE_MARGIN + pageWidth / 2, y, { width: pageWidth / 2 - 8, align: "right" });
        y += 16;
      });
      y += 12;
    };

    drawBlock("1. QUICK BILL & SALES", [
      { label: "Quick Bill Cash", value: fmt(data.quickBill?.cash) },
      { label: "Quick Bill Bank", value: fmt(data.quickBill?.bank) },
      { label: "Quick Bill Credit", value: fmt(data.quickBill?.credit) },
      { label: "Total Quick Bill", value: fmt(data.quickBill?.total) },
    ]);

    drawBlock("2. CUSTOMER PAYMENTS (RECEIPTS)", [
      { label: "Cash Received", value: fmt(data.customerPayment?.cash) },
      { label: "Bank Received", value: fmt(data.customerPayment?.bank) },
      { label: "Total Customer Payment", value: fmt(data.customerPayment?.nowTotal) },
    ]);

    drawBlock("3. SUPPLIER PAYMENTS", [
      { label: "Cash Paid", value: fmt(data.supplierPayment?.cash) },
      { label: "Bank Paid", value: fmt(data.supplierPayment?.bank) },
      { label: "Total Supplier Payment", value: fmt(data.supplierPayment?.nowTotal) },
    ]);

    drawBlock("4. PURCHASES", [
      { label: "Total Purchase Amount", value: fmt(data.purchases?.total) },
    ]);

    drawBlock("5. EXPENSES", [
      { label: "Total Expenses", value: fmt(data.expenses?.total) },
    ]);

    drawBlock("6. OUTSTANDING SUMMARY", [
      { label: "Supplier Outstanding (Payable)", value: fmt(data.outstanding?.supplier) },
      { label: "Customer Outstanding (Receivable)", value: fmt(data.outstanding?.customer) },
    ]);

    drawBlock("7. FINAL BALANCES", [
      { label: "Final Cash in Hand", value: fmt(data.finalBalances?.cash) },
      { label: "Final Bank (UPI)", value: fmt(data.finalBalances?.bank) },
    ]);

    doc.end();
  }
}
