import type { Campaign, Lead } from "@/lib/domain" import { formatShort } from "@/lib/time" function escapeCell(v: string) { if (v.includes('"') || v.includes(",") || v.includes("\n")) { return `"${v.replace(/"/g, '""')}"` } return v } export function leadsToCsv(args: { campaign: Campaign; leads: Lead[] }) { const fieldOrder = args.campaign.formSchema.map((f) => f.id) const header = [ "createdAt", "state", "utm_source", "utm_medium", "utm_campaign", "couponCode", "redeemedAt", ...fieldOrder.map((id) => `field_${id}`), ] const rows = args.leads.map((l) => [ formatShort(l.createdAt), l.state, l.source.utm_source ?? "", l.source.utm_medium ?? "", l.source.utm_campaign ?? "", l.couponCode ?? "", l.redeemedAt ? formatShort(l.redeemedAt) : "", ...fieldOrder.map((id) => l.fields[id] ?? ""), ]) const lines = [header, ...rows].map((r) => r.map((c) => escapeCell(`${c ?? ""}`)).join(",")) return lines.join("\n") } export function downloadTextFile(args: { filename: string; text: string; mime: string }) { const blob = new Blob([args.text], { type: args.mime }) const url = URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = args.filename document.body.appendChild(a) a.click() a.remove() URL.revokeObjectURL(url) }