// src/lib/keywords/export-full.test.ts
import { expect, test } from "bun:test";
import { buildFullCsv, csvField } from "./export-full";
import type { Keyword } from "./types";

function kw(term: string, extra: Partial<Keyword> = {}): Keyword {
  return {
    id: `id-${term}`,
    siteId: "s1",
    term,
    locale: { lang: "fr", country: "FR" },
    theme: null,
    status: "idea",
    intent: [],
    stages: [],
    primarySource: "manual",
    sources: ["manual"],
    metrics: {},
    trend: [],
    briefs: {},
    gsc: null,
    ...extra,
  } as Keyword;
}

test("csvField: échappe virgules, guillemets et retours ligne", () => {
  expect(csvField("simple")).toBe("simple");
  expect(csvField("a,b")).toBe('"a,b"');
  expect(csvField('dit "oui"')).toBe('"dit ""oui"""');
  expect(csvField("l1\nl2")).toBe('"l1\nl2"');
});

test("buildFullCsv: en-tête + N/A pour métriques absentes et GSC absent", () => {
  const csv = buildFullCsv([kw("sans data")]);
  const [header, row] = csv.trim().split("\n");
  expect(header).toBe(
    "Terme,Langue,Pays,Statut,Thème,Intentions,Stages,Sources,Volume,KD,CPC,Position GSC,Clics GSC,Impressions GSC,CTR GSC",
  );
  expect(row).toBe(
    "sans data,fr,FR,idea,,,,manual,N/A,N/A,N/A,N/A,N/A,N/A,N/A",
  );
});

test("buildFullCsv: consensus + GSC remplis, listes jointes par |", () => {
  const csv = buildFullCsv([
    kw("plein", {
      status: "active",
      intent: ["informational", "transactional"] as never,
      stages: ["research", "planning"],
      sources: ["semrush", "gsc"] as never,
      metrics: {
        semrush: { volume: 100, kd: 30, cpc: 1.5 } as never,
      },
      gsc: {
        clicks: 12,
        impressions: 340,
        ctr: 0.0353,
        position: 7.4,
        updatedAt: "2026-06-01T00:00:00Z",
      },
    }),
  ]);
  const row = csv.trim().split("\n")[1];
  expect(row).toBe(
    "plein,fr,FR,active,,informational|transactional,research|planning,semrush|gsc,100,30,1.5,7.4,12,340,3.5%",
  );
});

test("buildFullCsv: terme avec virgule est quoté", () => {
  const csv = buildFullCsv([kw("a, b")]);
  expect(csv.trim().split("\n")[1].startsWith('"a, b"')).toBe(true);
});
