import PDFDocument from "pdfkit";
import type { Response } from "express";
import { PdfHeader } from "./components/PdfHeader.js";
// import type { OutstandingReportData, OutstandingSection, OutstandingParty } from "../../services/OutstandingReportService.js";

const COLORS = {
  primary: "#0F5132",
  text: "#212529",
  muted: "#6C757D",
  border: "#DEE2E6",
  rowAlt: "#F8F9FA",
  pending: "#FFF0F2", // Light red
  pendingText: "#DC3545", // Red
};

const PAGE_MARGIN = 40;

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

export class OutstandingReportPdf {
  static async export(payload: any, type: "customers" | "suppliers", res: Response) {
    const doc = new PDFDocument({
      size: "A4",
      layout: "portrait",
      margin: PAGE_MARGIN,
      bufferPages: true,
    });

    const safeFilename = encodeURIComponent(`${type}-outstanding-report`);
    res.setHeader("Content-Type", "application/pdf");
    res.setHeader("Content-Disposition", `attachment; filename="${safeFilename}.pdf"`);
    res.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
    doc.pipe(res);

    const pageWidth = doc.page.width - PAGE_MARGIN * 2;
    const title = type === "customers" ? "CUSTOMER OUTSTANDING REPORT" : "SUPPLIER OUTSTANDING REPORT";

    await PdfHeader.draw(doc, pageWidth, PAGE_MARGIN, title);

    // Header Info
    doc.moveDown(0.5);
    doc.font("Helvetica-Bold").fontSize(10).text(`Generated At: `, { continued: true }).font("Helvetica").text(new Date().toLocaleString('en-IN'));
    doc.font("Helvetica-Bold").text(`Total Parties: `, { continued: true }).font("Helvetica").text(payload.summary.totalCount.toString());
    doc.font("Helvetica-Bold").text(`Total Outstanding: `, { continued: true }).font("Helvetica").text(`Rs. ${fmtAmount(payload.summary.totalOutstandingAmount)}`);
    doc.moveDown(1);

    // Table
    const cols: [any, any, any, any] = [
      { x: PAGE_MARGIN, w: 30, h: "S.No", a: "center" as const },
      { x: PAGE_MARGIN + 30, w: 140, h: "Name", a: "left" as const },
      { x: PAGE_MARGIN + 170, w: 90, h: "Mobile", a: "left" as const },
      // { x: PAGE_MARGIN + 260, w: 100, h: "Opening", a: "right" as const },
      { x: PAGE_MARGIN + 260, w: 100, h: "Outstanding", a: "right" as const },
      // { x: PAGE_MARGIN + 460, w: 50, h: "Status", a: "center" as const },
    ];

    const drawHeader = () => {
      doc.rect(PAGE_MARGIN, doc.y, pageWidth, 20).fill(COLORS.primary);
      doc.font("Helvetica-Bold").fontSize(9).fillColor("#FFF");
      const currentY = doc.y + 6;
      cols.forEach((col) => {
        doc.text(col.h, col.x, currentY, { width: col.w, align: col.a });
      });
      doc.y += 20;
    };

    drawHeader();

    let isAlt = false;
    payload.data.forEach((item: any, idx: number) => {
      if (doc.y > doc.page.height - PAGE_MARGIN - 40) {
        doc.addPage();
        drawHeader();
      }

      const rowY = doc.y;
      const isPending = item.outstandingBalance > 0;

      doc.rect(PAGE_MARGIN, rowY, pageWidth, 20).fill(isPending ? COLORS.pending : (isAlt ? COLORS.rowAlt : "#FFF"));
      isAlt = !isAlt;

      doc.font("Helvetica").fontSize(9).fillColor(COLORS.text);
      const textY = rowY + 6;

      doc.text((idx + 1).toString(), cols[0].x, textY, { width: cols[0].w, align: cols[0].a });
      doc.text(item.name, cols[1].x, textY, { width: cols[1].w, align: cols[1].a, lineBreak: false });
      doc.text(item.mobileNo, cols[2].x, textY, { width: cols[2].w, align: cols[2].a });
      // doc.text(fmtAmount(item.openingBalance), cols[3].x, textY, { width: cols[3].w, align: cols[3].a });

      if (isPending) doc.font("Helvetica-Bold").fillColor(COLORS.pendingText);
      doc.text(fmtAmount(item.outstandingBalance), cols[3].x, textY, { width: cols[3].w, align: cols[3].a });

      doc.font("Helvetica").fillColor(COLORS.text);
      // doc.text(item.status ? "Active" : "Inactive", cols[5].x, textY, { width: cols[5].w, align: cols[5].a });

      doc.y += 20;
    });

    // Summary Total
    doc.moveDown(1);
    doc.font("Helvetica-Bold").fontSize(11).fillColor(COLORS.text);
    doc.text(`Total Outstanding Amount: Rs. ${fmtAmount(payload.summary.totalOutstandingAmount)}`, { align: 'right' });

    // Page Numbers
    const pages = doc.bufferedPageRange();
    for (let i = 0; i < pages.count; i++) {
      doc.switchToPage(i);
      doc.font("Helvetica").fontSize(8).fillColor(COLORS.muted);
      doc.text(
        `Page ${i + 1} of ${pages.count}`,
        PAGE_MARGIN,
        doc.page.height - PAGE_MARGIN / 2,
        { width: pageWidth, align: "center" }
      );
    }

    doc.end();
  }
}
