function formatDate(dateStr?: string) {
  if (!dateStr) return "";
  const date = new Date(dateStr);
  if (isNaN(date.getTime())) return "";
  return date.toLocaleDateString("en-GB", {
    day: "2-digit",
    month: "short",
    year: "numeric",
  }).replace(/ /g, " ");
}

export const convertToCSV = (data: any[]) => {
  if (!data.length) return "";

  // Required CSV columns in order
  const columns = [
    "Invoice Number",
    "Company Name",
    "Company Website URL",
    "Issued Date",
    "Expiry Date",
    "Plan Validity (Value)",
    "Plan Validity (Unit)",
    "Total Users",
    "Price",
    "Tax",
    "Discount",
    "Final Price",
    "Status",
    "Note",
  ];

  const csvRows = [columns.join(",")];

  for (const item of data) {
    // Handle company object
    const companyName = item.company?.name ?? (item.company === null ? "N/A" : "");
    const companyWebsite = item.company?.websiteUrl ?? "";

    // Dates
    const issuedDate = formatDate(item.issuedDate);
    const expiryDate = formatDate(item.dueDate);

    // Plan validity
    const planValidityValue = item.planValidity?.validfor ?? "";
    const planValidityUnit = item.planValidity?.validUnit ?? "";

    // Numbers
    const totalUsers = item.maxUserCount ?? "";
    const price = item.price ?? "";
    const tax = item.tax ?? "";
    const discount = item.discount ?? "";
    const finalPrice = item.finalPrice ?? "";

    // Status
    let status = item.status ?? "";
    if (status === "paid") status = "Paid";
    else if (status === "unpaid") status = "UnPaid";
    else if (status === "overdue") status = "OverDue";

    // Note
    const note = item.note ?? "";

    // Invoice Number
    const invoiceNumber = item.invoiceNumber ?? "";

    // Row in required order
    const row = [
      invoiceNumber,
      companyName,
      companyWebsite,
      issuedDate,
      expiryDate,
      planValidityValue,
      planValidityUnit,
      totalUsers,
      price,
      tax,
      discount,
      finalPrice,
      status,
      note,
    ].map((v) => (v === null || v === undefined ? "" : `${v}`.replace(/\r|\n|,/g, " ").trim()));

    csvRows.push(row.join(","));
  }

  return csvRows.join("\n");
};