// src/lib/keywords/export-full.ts — export CSV « données complètes » (ELEVA-53).
// Toutes colonnes, N/A pour les métriques absentes, positions GSC incluses.
import { consensusMetrics } from "./consensus";
import type { Keyword } from "./types";

const HEADER = [
  "Terme",
  "Langue",
  "Pays",
  "Statut",
  "Thème",
  "Intentions",
  "Stages",
  "Sources",
  "Volume",
  "KD",
  "CPC",
  "Position GSC",
  "Clics GSC",
  "Impressions GSC",
  "CTR GSC",
];

/** Quote le champ si nécessaire (virgule, guillemet, retour ligne). */
export function csvField(value: string): string {
  return /[",\n]/.test(value) ? `"${value.replaceAll('"', '""')}"` : value;
}

const na = (v: number | null | undefined): string =>
  v == null ? "N/A" : String(v);

export function buildFullCsv(keywords: Keyword[]): string {
  const lines = [HEADER.join(",")];
  for (const k of keywords) {
    const c = consensusMetrics(k.metrics);
    const row = [
      k.term,
      k.locale.lang,
      k.locale.country,
      k.status,
      k.theme ?? "",
      k.intent.join("|"),
      k.stages.join("|"),
      k.sources.join("|"),
      na(c.volume),
      na(c.kd),
      na(c.cpc),
      na(k.gsc?.position),
      na(k.gsc?.clicks),
      na(k.gsc?.impressions),
      k.gsc ? `${(k.gsc.ctr * 100).toFixed(1)}%` : "N/A",
    ];
    lines.push(row.map(csvField).join(","));
  }
  return `${lines.join("\n")}\n`;
}
