import { expect, test } from "bun:test";
import { type MergeableKeyword, mergeKeywords } from "./merge-keywords";

const base: MergeableKeyword = {
  id: "s-electricite",
  siteId: "s",
  term: "electricite",
  lang: "fr",
  country: "FR",
  theme: null,
  status: "idea",
  intent: [],
  stages: [],
  primarySource: "gsc",
  sources: ["gsc"],
  metrics: {},
  trend: [],
  serpFeatures: null,
  briefs: {},
  gsc: null,
  serp: {},
};

test("unions sources/stages/intent and merges metrics by source", () => {
  const a: MergeableKeyword = {
    ...base,
    term: "électricité",
    status: "watch",
    stages: ["research"],
    intent: ["informational"],
    sources: ["gsc"],
    metrics: { gsc: { volume: 10 } as never },
    trend: [{ month: "2025-01", volume: 10 }],
  };
  const b: MergeableKeyword = {
    ...base,
    id: "s-electricite",
    term: "electricite",
    status: "active",
    stages: ["planning"],
    intent: ["commercial"],
    sources: ["ahrefs"],
    metrics: { ahrefs: { volume: 20, kd: 5 } as never },
    trend: [
      { month: "2025-01", volume: 10 },
      { month: "2025-02", volume: 12 },
    ],
  };
  const m = mergeKeywords("s-electricite", [a, b]);
  expect(m.id).toBe("s-electricite");
  expect(m.term).toBe("électricité"); // accented term preferred
  expect(m.status).toBe("active"); // most-advanced
  expect(new Set(m.stages)).toEqual(new Set(["research", "planning"]));
  expect(new Set(m.intent)).toEqual(new Set(["informational", "commercial"]));
  expect(new Set(m.sources)).toEqual(new Set(["gsc", "ahrefs"]));
  expect(m.metrics).toEqual({
    gsc: { volume: 10 },
    ahrefs: { volume: 20, kd: 5 },
  } as never);
  expect(m.trend.length).toBe(2); // longest trend wins
});

test("coalesces gsc preferring the better (lower) position", () => {
  const a = { ...base, gsc: { position: 8 } as never };
  const b = { ...base, gsc: { position: 3 } as never };
  expect(mergeKeywords(base.id, [a, b]).gsc).toEqual({ position: 3 } as never);
  expect(mergeKeywords(base.id, [{ ...base, gsc: null }, a]).gsc).toEqual({
    position: 8,
  } as never);
});

test("merges briefs by country key", () => {
  const a = { ...base, briefs: { FR: { country: "FR" } as never } };
  const b = { ...base, briefs: { US: { country: "US" } as never } };
  expect(Object.keys(mergeKeywords(base.id, [a, b]).briefs).sort()).toEqual([
    "FR",
    "US",
  ]);
});
