import { describe, it, expect } from "vitest";
import { seedOnderdelen } from "./index";
import { detecteerPariteitsGaps, genereerPariteitsVoorstellen, TE_VERTALEN } from "./pariteit";
import type { Modelonderdeel } from "./types";

function maakOnderdeel(over: Partial<Modelonderdeel> & Pick<Modelonderdeel, "id">): Modelonderdeel {
  return {
    titel: over.id,
    categorie: "bijzonder",
    omschrijving: "test",
    tekst: "",
    varianten: [],
    parameters: [],
    toepasbaarOp: ["test"],
    versie: "1.0",
    datum: "2026-01-01",
    ...over,
  };
}

describe("NL/FR pariteit — live bibliotheek", () => {
  it("de seed-bibliotheek heeft geen variant-pariteitsgaps", () => {
    expect(detecteerPariteitsGaps(seedOnderdelen)).toEqual([]);
  });

  it("genereert dus geen openstaande pariteitsvoorstellen", () => {
    expect(genereerPariteitsVoorstellen(seedOnderdelen, "2026-06-29")).toEqual([]);
  });
});

describe("NL/FR pariteit — automatische verbetervoorstellen", () => {
  const nl = maakOnderdeel({
    id: "demo",
    titel: "Demo-clausule",
    varianten: [
      { id: "a", hypothese: "Hypothese A", tekst: "NL tekst A" },
      { id: "b", hypothese: "Hypothese B", tekst: "NL tekst B" },
    ],
  });
  const fr = maakOnderdeel({
    id: "demo-fr",
    titel: "Clause démo",
    taal: "fr",
    vertalingVanId: "demo",
    varianten: [{ id: "a", hypothese: "Hypothèse A", tekst: "FR texte A" }],
  });

  it("detecteert de ontbrekende variant in het FR-onderdeel", () => {
    const gaps = detecteerPariteitsGaps([nl, fr]);
    expect(gaps).toHaveLength(1);
    expect(gaps[0]).toMatchObject({ nlId: "demo", frId: "demo-fr", ontbreektInFr: ["b"], ontbreektInNl: [] });
  });

  it("stelt voor de ontbrekende variant over te nemen, gemarkeerd [TE VERTALEN]", () => {
    const voorstellen = genereerPariteitsVoorstellen([nl, fr], "2026-06-29");
    expect(voorstellen).toHaveLength(1);
    const v = voorstellen[0];
    expect(v.onderdeelId).toBe("demo-fr");
    expect(v.status).toBe("open");
    // De aangevulde versie heeft beide varianten, met variant "b" overgenomen.
    const ids = v.voorgesteldOnderdeel.varianten.map((x) => x.id);
    expect(ids).toEqual(["a", "b"]);
    const overgenomen = v.voorgesteldOnderdeel.varianten.find((x) => x.id === "b")!;
    expect(overgenomen.hypothese.startsWith(TE_VERTALEN)).toBe(true);
    expect(overgenomen.tekst).toContain(TE_VERTALEN);
    expect(overgenomen.tekst).toContain("NL tekst B");
  });

  it("werkt ook omgekeerd: ontbrekende NL-variant wordt uit het FR overgenomen", () => {
    const frRijker = maakOnderdeel({
      ...fr,
      varianten: [
        { id: "a", hypothese: "Hypothèse A", tekst: "FR texte A" },
        { id: "c", hypothese: "Hypothèse C", tekst: "FR texte C" },
      ],
    });
    const voorstellen = genereerPariteitsVoorstellen([nl, frRijker], "2026-06-29");
    // FR mist "b" (uit NL); NL mist "c" (uit FR) → twee voorstellen.
    expect(voorstellen).toHaveLength(2);
    const naarNl = voorstellen.find((v) => v.onderdeelId === "demo")!;
    expect(naarNl.voorgesteldOnderdeel.varianten.map((x) => x.id)).toEqual(["a", "b", "c"]);
  });
});
