// src/lib/sites/schema.test.ts
import { describe, expect, test } from "bun:test";
import { siteInputSchema } from "./schema";

const base = {
  name: "Atelier Forge",
  url: "https://atelierforge.com",
};

function parse(input: Record<string, unknown>) {
  return siteInputSchema.safeParse({ ...base, ...input });
}

describe("siteInputSchema", () => {
  test("accepts full Google Ads codes including zh_CN", () => {
    const res = parse({
      primaryLanguage: "zh_CN",
      languages: ["en", "fr"],
      targetCountries: ["FR"],
    });
    expect(res.success).toBe(true);
    if (!res.success) return;
    expect(res.data.primaryLanguage).toBe("zh_CN");
    expect(res.data.languages).toEqual(["en", "fr"]);
  });

  test("legacy 'zh' normalizes to zh_CN (primary + additional)", () => {
    const res = parse({
      primaryLanguage: "zh",
      languages: ["fr"],
      targetCountries: [],
    });
    expect(res.success).toBe(true);
    if (!res.success) return;
    expect(res.data.primaryLanguage).toBe("zh_CN");
  });

  test("case-insensitive language input is canonicalized", () => {
    const res = parse({
      primaryLanguage: "FR",
      languages: ["EN"],
      targetCountries: ["fr"],
    });
    expect(res.success).toBe(true);
    if (!res.success) return;
    expect(res.data.primaryLanguage).toBe("fr");
    expect(res.data.languages).toEqual(["en"]);
    expect(res.data.targetCountries).toEqual(["FR"]);
  });

  test("primary language is stripped from additional languages", () => {
    const res = parse({
      primaryLanguage: "fr",
      languages: ["fr", "en"],
      targetCountries: [],
    });
    expect(res.success).toBe(true);
    if (!res.success) return;
    expect(res.data.languages).toEqual(["en"]);
  });

  test("duplicate additional languages and countries are removed", () => {
    const res = parse({
      primaryLanguage: "en",
      languages: ["fr", "fr", "de"],
      targetCountries: ["FR", "FR", "US"],
    });
    expect(res.success).toBe(true);
    if (!res.success) return;
    expect(res.data.languages).toEqual(["fr", "de"]);
    expect(res.data.targetCountries).toEqual(["FR", "US"]);
  });

  test("unknown primary language is rejected", () => {
    const res = parse({
      primaryLanguage: "xx",
      languages: [],
      targetCountries: [],
    });
    expect(res.success).toBe(false);
    if (res.success) return;
    expect(res.error.issues[0]?.message).toBe("Langue principale inconnue");
  });

  test("unknown additional language is rejected", () => {
    const res = parse({
      primaryLanguage: "fr",
      languages: ["zz"],
      targetCountries: [],
    });
    expect(res.success).toBe(false);
  });

  test("country membership is enforced (unknown rejected)", () => {
    const res = parse({
      primaryLanguage: "fr",
      languages: [],
      targetCountries: ["ZZ"],
    });
    expect(res.success).toBe(false);
  });
});
