// src/lib/keywords/fixtures.test.ts
import { expect, test } from "bun:test";
import { KEYWORDS } from "./fixtures";
import { getKeywordsForSite, SITES } from "./sites";
import { KEYWORD_THEMES } from "./types";

const VALID_THEMES = new Set(KEYWORD_THEMES.map((t) => t.id));

test("has 3 sites", () => {
  expect(SITES.map((s) => s.id)).toEqual([
    "lustre-lab",
    "atelier-forge",
    "maison-aurum",
  ]);
});

test("every keyword belongs to a known site", () => {
  const siteIds = new Set(SITES.map((s) => s.id));
  for (const k of KEYWORDS) expect(siteIds.has(k.siteId)).toBe(true);
});

test("each site has between 9 and 12 keywords", () => {
  for (const s of SITES) {
    const n = getKeywordsForSite(s.id).length;
    expect(n).toBeGreaterThanOrEqual(9);
    expect(n).toBeLessThanOrEqual(12);
  }
});

test("getKeywordsForSite isolates by siteId", () => {
  for (const s of SITES)
    for (const k of getKeywordsForSite(s.id)) expect(k.siteId).toBe(s.id);
});

test("every keyword has valid theme, mangools metrics, and a trend", () => {
  for (const k of KEYWORDS) {
    expect(k.theme === null || VALID_THEMES.has(k.theme)).toBe(true);
    expect(k.metrics.mangools).toBeDefined();
    expect(k.metrics.mangools?.volume).toBeGreaterThan(0);
    expect(k.intent.length).toBeGreaterThan(0);
    expect(k.trend.length).toBeGreaterThan(0);
    expect(k.id).toBe(
      `${k.siteId}-${k.term.replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "")}`,
    );
  }
});

test("ids are unique", () => {
  const ids = KEYWORDS.map((k) => k.id);
  expect(new Set(ids).size).toBe(ids.length);
});
