// const PDFDocument = require("pdfkit");

// const generateCustomerStatementPdf = (res, { customer, rows, closingBalance }) => {
//   const doc = new PDFDocument({ margin: 40, size: "A4" });

//   res.setHeader("Content-Type", "application/pdf");
//   res.setHeader(
//     "Content-Disposition",
//     `attachment; filename=STATEMENT-${customer.name}.pdf`
//   );

//   doc.pipe(res);

//   /* ================= HEADER ================= */
//   doc.fontSize(16).text("Customer Statement", { align: "center" });
//   doc.moveDown();

//   doc.fontSize(10);
//   doc.text(`Customer: ${customer.name}`);
//   doc.text(`Email: ${customer.email || "-"}`);
//   doc.text(`Phone: ${customer.phone || "-"}`);
//   doc.moveDown(1.5);

//   /* ================= TABLE SETUP ================= */
//   const tableTop = doc.y;

//   const col = {
//     date: 40,
//     type: 90,
//     ref: 150,
//     desc: 270,
//     debit: 420,
//     credit: 480,
//     // balance: 540,
//     balance: 500,
//     // end: 600,
//     end: 555,

//   };

//   const rowHeight = 20;

//   /* ================= TABLE HEADER ================= */
//   doc.font("Helvetica-Bold").fontSize(9);

//   doc.text("Date", col.date + 5, tableTop + 5);
//   doc.text("Type", col.type + 5, tableTop + 5);
//   doc.text("Reference", col.ref + 5, tableTop + 5);
//   doc.text("Description", col.desc + 5, tableTop + 5);
//   doc.text("Debit", col.debit, tableTop + 5, { width: 50, align: "right" });
//   doc.text("Credit", col.credit, tableTop + 5, { width: 50, align: "right" });
//   doc.text("Balance", col.balance, tableTop + 5, { width: 50, align: "right" });

//   /* Header borders */
//   drawRowBorder(doc, tableTop, rowHeight, col);

//   doc.font("Helvetica");

//   /* ================= TABLE ROWS ================= */
//   let y = tableTop + rowHeight;

//   rows.forEach((r) => {
//     if (y > 750) {
//       doc.addPage();
//       y = 50;
//     }

//     doc.text(
//       r.date ? new Date(r.date).toLocaleDateString("en-IN") : "-",
//       col.date + 5,
//       y + 5
//     );

//     doc.text(r.type, col.type + 5, y + 5);
//     doc.text(r.reference, col.ref + 5, y + 5);
//     doc.text(r.description, col.desc + 5, y + 5, { width: 140 });

//     doc.text(
//       r.debit ? `₹${r.debit}` : "",
//       col.debit,
//       y + 5,
//       { width: 50, align: "right" }
//     );

//     doc.text(
//       r.credit ? `₹${r.credit}` : "",
//       col.credit,
//       y + 5,
//       { width: 50, align: "right" }
//     );

//     doc.text(
//       `₹${r.balance}`,
//       col.balance,
//       y + 5,
//       { width: 50, align: "right" }
//     );

//     /* Draw borders for this row */
//     drawRowBorder(doc, y, rowHeight, col);

//     y += rowHeight;
//   });

//   /* ================= CLOSING BALANCE ================= */
//   doc.moveDown(2);
//   doc.font("Helvetica-Bold").fontSize(11);
//   doc.text(`Closing Balance: ₹${closingBalance}`, col.balance - 20, y + 10, {
//     align: "right",
//   });

//   doc.end();
// };

// /* ================= BORDER HELPER ================= */
// function drawRowBorder(doc, y, height, col) {
//   // Horizontal lines
//   doc.moveTo(col.date, y).lineTo(col.end, y).stroke();
//   doc.moveTo(col.date, y + height).lineTo(col.end, y + height).stroke();

//   // Vertical lines
//   [
//     col.date,
//     col.type,
//     col.ref,
//     col.desc,
//     col.debit,
//     col.credit,
//     col.balance,
//     col.end,
//   ].forEach((x) => {
//     doc.moveTo(x, y).lineTo(x, y + height).stroke();
//   });
// }

// module.exports = generateCustomerStatementPdf;


// const PDFDocument = require("pdfkit");

// const generateCustomerStatementPdf = (res, { customer, rows, closingBalance }) => {
//   const doc = new PDFDocument({ size: "A4", margin: 40 });

//   res.setHeader("Content-Type", "application/pdf");
//   res.setHeader(
//     "Content-Disposition",
//     `attachment; filename=STATEMENT-${customer.name}.pdf`
//   );

//   doc.pipe(res);

//   /* ================= HEADER ================= */
//   doc.fontSize(16).font("Helvetica-Bold");
//   doc.text("Customer Statement", { align: "center" });
//   doc.moveDown();

//   doc.fontSize(10).font("Helvetica");
//   doc.text(`Customer: ${customer.name}`);
//   doc.text(`Email: ${customer.email || "-"}`);
//   doc.text(`Phone: ${customer.phone || "-"}`);
//   doc.moveDown(1.5);

//   /* ================= TABLE CONFIG ================= */
//   const tableTop = doc.y;
//   const rowHeight = 22;

//   // ✔ Carefully balanced for A4 width (595 - margins)
//   const col = {
//     date: 38,
//     type: 90,
//     ref: 150,
//     desc: 250,
//     debit: 350,
//     credit: 430,
//     balance: 490,
//     end: 555,
//   };

//   /* ================= TABLE HEADER ================= */
//   doc.font("Helvetica-Bold").fontSize(9);

//   drawHeaderText(doc, tableTop, col);
//   drawRowBorder(doc, tableTop, rowHeight, col);

//   doc.font("Helvetica");

//   /* ================= TABLE ROWS ================= */
//   let y = tableTop + rowHeight;

//   rows.forEach((r) => {
//     // Page break
//     if (y + rowHeight > doc.page.height - 40) {
//       doc.addPage();
//       y = 50;

//       // Repeat header on new page
//       doc.font("Helvetica-Bold").fontSize(9);
//       drawHeaderText(doc, y, col);
//       drawRowBorder(doc, y, rowHeight, col);
//       doc.font("Helvetica");

//       y += rowHeight;
//     }

//     drawRowText(doc, y, r, col);
//     drawRowBorder(doc, y, rowHeight, col);

//     y += rowHeight;
//   });

//   /* ================= CLOSING BALANCE ================= */
//   doc.moveDown(2);
//   doc.font("Helvetica-Bold").fontSize(11);
//   doc.text(
//     `Closing Balance: ₹${closingBalance}`,
//     col.debit -10,
//     y + 10,
//     { width: col.end - col.debit, align: "right" }
//   );

//   doc.end();
// };

// /* ================= HEADER TEXT ================= */
// function drawHeaderText(doc, y, col) {
//   doc.text("Date", col.date + 5, y + 6);
//   doc.text("Type", col.type + 5, y + 6);
//   doc.text("Reference", col.ref + 5, y + 6);
//   doc.text("Description", col.desc + 5, y + 6);

//   doc.text("Debit", col.debit, y + 6, {
//     width: col.credit - col.debit,
//     align: "center",
//   });

//   doc.text("Credit", col.credit, y + 6, {
//     width: col.balance - col.credit,
//     align: "center",
//   });

//   doc.text("Balance", col.balance, y + 6, {
//     width: col.end - col.balance,
//     align: "center",
//   });
// }

// /* ================= ROW TEXT ================= */
// function drawRowText(doc, y, r, col) {
//   doc.text(
//     r.date ? new Date(r.date).toLocaleDateString("en-IN") : "-",
//     col.date + 5,
//     y + 6
//   );

//   doc.text(r.type, col.type + 5, y + 6);
//   doc.text(r.reference || "-", col.ref + 5, y + 6);
//   doc.text(r.description || "-", col.desc + 5, y + 6, {
//     width: col.debit - col.desc - 10,
//   });

//   doc.text(
//     r.debit ? `₹${r.debit}` : "",
//     col.debit,
//     y + 6,
//     { width: col.credit - col.debit, align: "center" }
//   );

//   doc.text(
//     r.credit ? `₹${r.credit}` : "",
//     col.credit,
//     y + 6,
//     { width: col.balance - col.credit, align: "center" }
//   );

//   doc.text(
//     `₹${r.balance}`,
//     col.balance,
//     y + 6,
//     { width: col.end - col.balance, align: "center" }
//   );
// }

// /* ================= BORDERS ================= */
// function drawRowBorder(doc, y, height, col) {
//   // Horizontal
//   doc.moveTo(col.date, y).lineTo(col.end, y).stroke();
//   doc.moveTo(col.date, y + height).lineTo(col.end, y + height).stroke();

//   // Vertical
//   [
//     col.date,
//     col.type,
//     col.ref,
//     col.desc,
//     col.debit,
//     col.credit,
//     col.balance,
//     col.end,
//   ].forEach((x) => {
//     doc.moveTo(x, y).lineTo(x, y + height).stroke();
//   });
// }

// module.exports = generateCustomerStatementPdf;

const PDFDocument = require("pdfkit");
const path = require("path");

const generateCustomerStatementPdf = (
  res,
  { company = {}, customer = {}, rows = [], closingBalance = 0 }
) => {
  const doc = new PDFDocument({ size: "A4", margin: 40 });

  /* ================= RESPONSE HEADERS ================= */
  res.setHeader("Content-Type", "application/pdf");
  res.setHeader(
    "Content-Disposition",
    `attachment; filename=STATEMENT-${customer.name || "CUSTOMER"}.pdf`
  );
  res.setHeader("Cache-Control", "no-store");

  doc.pipe(res);

  const pageLeft = 40;
  const pageRight = 555;
  let y = 40;

  /* ================= LOGO ================= */
  const logoPath = path.resolve(
    process.cwd(),
    "uploads/images/company-logo.png"
  );

  try {
    doc.image(logoPath, pageLeft, y, { width: 90 });
    y += 30;
  } catch (err) {
    // Logo optional – never break PDF
    y += 20;
  }

  /* ================= COMPANY INFO ================= */
  doc
    .font("Helvetica-Bold")
    .fontSize(14)
    .text(company.name || "-", pageLeft, y);

  y += 18;

  doc
    .font("Helvetica")
    .fontSize(9)
    .text(company.address || "-", pageLeft, y);

  y += 14;

  doc
    .fontSize(9)
    .text(`GSTIN: ${company.gstin || "--"}`, pageLeft, y);

  y += 25;

  /* ================= STATEMENT META (RIGHT) ================= */
  doc
    .font("Helvetica-Bold")
    .fontSize(10)
    .text("Date:", pageLeft, 70, {
      width: pageRight - pageLeft,
      align: "right",
    })
    .font("Helvetica")
    .text(new Date().toLocaleDateString("en-IN"), pageLeft, 85, {
      width: pageRight - pageLeft,
      align: "right",
    });

  /* ================= DIVIDER ================= */
  doc.moveTo(pageLeft, y).lineTo(pageRight, y).stroke();
  y += 20;

  /* ================= TITLE ================= */
  doc.font("Helvetica-Bold").fontSize(16);
  doc.text("Customer Statement", { align: "center" });
  doc.moveDown();

  /* ================= CUSTOMER INFO ================= */
  doc.font("Helvetica").fontSize(10);
  doc.text(`Customer: ${customer.name || "-"}`);
  doc.text(`Email: ${customer.email || "-"}`);
  doc.text(`Phone: ${customer.phone || "-"}`);
  doc.moveDown(1.5);

  /* ================= TABLE CONFIG ================= */
  const tableTop = doc.y;
  const rowHeight = 22;

  const col = {
    date: 38,
    type: 90,
    ref: 150,
    desc: 250,
    // debit: 350,
    // credit: 430,
    amount: 430,
    balance: 490,
    end: 555,
  };

  /* ================= TABLE HEADER ================= */
  doc.font("Helvetica-Bold").fontSize(9);
  drawHeaderText(doc, tableTop, col);
  drawRowBorder(doc, tableTop, rowHeight, col);

  doc.font("Helvetica");

  /* ================= TABLE ROWS ================= */
  let rowY = tableTop + rowHeight;

  rows.forEach((r) => {
    if (rowY + rowHeight > doc.page.height - 40) {
      doc.addPage();
      rowY = 50;

      doc.font("Helvetica-Bold").fontSize(9);
      drawHeaderText(doc, rowY, col);
      drawRowBorder(doc, rowY, rowHeight, col);
      doc.font("Helvetica");

      rowY += rowHeight;
    }

    drawRowText(doc, rowY, r, col);
    drawRowBorder(doc, rowY, rowHeight, col);

    rowY += rowHeight;
  });

  /* ================= CLOSING BALANCE ================= */
  doc.font("Helvetica-Bold").fontSize(11);
  doc.text(
    `Closing Balance: ₹${closingBalance}`,
    // col.debit - 10,
    col.amount - 10,
    rowY + 10,
    { width: col.end - col.debit, align: "right" }
  );

  doc.end();
};

/* ================= HEADER TEXT ================= */
function drawHeaderText(doc, y, col) {
  doc.text("Date", col.date + 5, y + 6);
  doc.text("Type", col.type + 5, y + 6);
  doc.text("Reference", col.ref + 5, y + 6);
  doc.text("Description", col.desc + 5, y + 6);

  // doc.text("Debit", col.debit, y + 6, {
  //   width: col.credit - col.debit,
  //   align: "center",
  // });

  // doc.text("Credit", col.credit, y + 6, {
  //   width: col.balance - col.credit,
  //   align: "center",
  // });
  doc.text("Amount", col.amount, y + 6, {
    width: col.balance - col.amount,
    align: "center",
  });

  doc.text("Balance", col.balance, y + 6, {
    width: col.end - col.balance,
    align: "center",
  });
}

/* ================= ROW TEXT ================= */
function drawRowText(doc, y, r, col) {
  doc.text(
    r.date ? new Date(r.date).toLocaleDateString("en-IN") : "-",
    col.date + 5,
    y + 6
  );

  doc.text(r.type || "-", col.type + 5, y + 6);
  doc.text(r.reference || "-", col.ref + 5, y + 6);

  doc.text(r.description || "-", col.desc + 5, y + 6, {
    width: col.debit - col.desc - 10,
  });

  // doc.text(r.debit ? `₹${r.debit}` : "", col.debit, y + 6, {
  //   width: col.credit - col.debit,
  //   align: "center",
  // });

  // doc.text(r.credit ? `₹${r.credit}` : "", col.credit, y + 6, {
  //   width: col.balance - col.credit,
  //   align: "center",
  // });
  const amount = r.debit > 0 ? r.debit : r.credit;

  doc.text(
    amount ? `₹${amount}` : "",
    col.amount,
    y + 6,
    {
      width: col.balance - col.amount,
      align: "center",
    }
  );


  doc.text(`₹${r.balance || 0}`, col.balance, y + 6, {
    width: col.end - col.balance,
    align: "center",
  });
}

/* ================= BORDERS ================= */
function drawRowBorder(doc, y, height, col) {
  // Horizontal
  doc.moveTo(col.date, y).lineTo(col.end, y).stroke();
  doc.moveTo(col.date, y + height).lineTo(col.end, y + height).stroke();

  // Vertical
  [
    col.date,
    col.type,
    col.ref,
    col.desc,
    // col.debit,
    // col.credit,
    col.amount,
    col.balance,
    col.end,
  ].forEach((x) => {
    doc.moveTo(x, y).lineTo(x, y + height).stroke();
  });
}

module.exports = generateCustomerStatementPdf;
