export type CsvValue = boolean | number | string | null | undefined;

const escapeCsvCell = (value: CsvValue): string => {
  if (value === null || value === undefined) return "";

  const stringValue = String(value);
  const safeValue =
    typeof value === "string" && /^[\t\r\n=+\-@]/.test(stringValue)
      ? `'${stringValue}`
      : stringValue;

  return `"${safeValue.replace(/"/g, '""')}"`;
};

export const downloadCsv = (filename: string, rows: CsvValue[][]): void => {
  const contents = `\uFEFF${rows.map((row) => row.map(escapeCsvCell).join(",")).join("\r\n")}`;
  const url = URL.createObjectURL(new Blob([contents], { type: "text/csv;charset=utf-8" }));
  const link = document.createElement("a");

  link.href = url;
  link.download = filename;
  link.click();
  URL.revokeObjectURL(url);
};
