function formatCsvValue(value: unknown) {
  if (value === null || value === undefined) return "";
  if (value instanceof Date) return value.toISOString();
  if (Buffer.isBuffer(value)) return value.toString("base64");
  if (typeof value === "object") return JSON.stringify(value);

  const text = String(value);
  if (typeof value === "string" && /^[=+\-@\t\r]/.test(text)) {
    return `'${text}`;
  }
  return text;
}

function escapeCsvCell(value: unknown) {
  return `"${formatCsvValue(value).replace(/"/g, '""')}"`;
}

export function buildExcelCompatibleCsv(
  columns: string[],
  rows: Record<string, unknown>[],
) {
  const lines = [
    columns.map(escapeCsvCell).join(";"),
    ...rows.map((row) =>
      columns.map((column) => escapeCsvCell(row[column])).join(";"),
    ),
  ];

  return `\uFEFF${lines.join("\r\n")}`;
}

export function csvDownloadResponse(
  filename: string,
  columns: string[],
  rows: Record<string, unknown>[],
) {
  return new Response(buildExcelCompatibleCsv(columns, rows), {
    status: 200,
    headers: {
      "Cache-Control": "no-store",
      "Content-Disposition": `attachment; filename="${filename}"`,
      "Content-Type": "text/csv; charset=utf-8",
      "X-Content-Type-Options": "nosniff",
    },
  });
}
