import { describe, it, expect } from "vitest";
import { vindModelbriefGroep, vulModelbriefIn, bepaalOntvangerRol } from "./samenstellen";
import type { Modelbrief, OntvangerRol } from "./types";

function maakBrief(over: Partial<Modelbrief> & Pick<Modelbrief, "id" | "taal">): Modelbrief {
  return {
    titel: over.id,
    categorie: "betaling",
    ontvanger: "cliënt",
    onderwerp: "",
    tekst: "",
    varianten: [],
    parameters: [],
    versie: "1.0",
    datum: "2026-01-01",
    ...over,
  };
}

describe("vindModelbriefGroep", () => {
  const nl = maakBrief({ id: "brief-nl", taal: "nl" });
  const fr = maakBrief({ id: "brief-fr", taal: "fr", vertalingVanId: "brief-nl" });
  const en = maakBrief({ id: "brief-en", taal: "en", vertalingVanId: "brief-nl" });
  const alle = [nl, fr, en];

  it("vindt alle taalversies vanuit de NL-bronbrief", () => {
    expect(vindModelbriefGroep(nl, alle)).toEqual({ nl, fr, en });
  });

  it("vindt alle taalversies vanuit een vertaling (omgekeerde richting)", () => {
    expect(vindModelbriefGroep(fr, alle)).toEqual({ nl, fr, en });
    expect(vindModelbriefGroep(en, alle)).toEqual({ nl, fr, en });
  });

  it("geeft enkel de aanwezige taalversies als een vertaling ontbreekt", () => {
    expect(vindModelbriefGroep(nl, [nl, fr])).toEqual({ nl, fr });
  });

  it("geeft enkel zichzelf als er geen vertalingen bestaan", () => {
    const alleenstaand = maakBrief({ id: "alleenstaand", taal: "nl" });
    expect(vindModelbriefGroep(alleenstaand, [alleenstaand])).toEqual({ nl: alleenstaand });
  });
});

describe("bepaalOntvangerRol", () => {
  // Elk `ontvanger`-label dat effectief in de brieven-bibliotheek voorkomt
  // (data/modelbrieven/brieven/*.ts) — vangt een stille misclassificatie op
  // zodra een nieuw label wordt toegevoegd dat niet door de regels wordt gedekt.
  const gevallen: [string, OntvangerRol][] = [
    ["SPF Finances", "fiscus"],
    ["bank", "bank"],
    ["client / banque", "bank"],
    ["cliënt / bank", "bank"],
    ["bemiddelaar", "makelaar"],
    ["candidat acquéreur", "client-koper"],
    ["candidate buyer", "client-koper"],
    ["client", "client-overig"],
    ["cliënt (bestuurder/aandeelhouder)", "client-overig"],
    ["cliënt (erfgenaam)", "client-overig"],
    ["cliënt (oprichter)", "client-overig"],
    ["confrater", "confrater"],
    ["confrater (koper)", "confrater"],
    ["confrater (verkoper)", "confrater"],
    ["confrater minuuthouder", "confrater"],
    ["hoogste bieder", "bieder"],
    ["kandidaat-koper", "client-koper"],
    ["koper", "client-koper"],
    ["koper (cliënt)", "client-koper"],
    ["notaris verkoper / makelaar", "confrater"],
    ["plus offrant", "bieder"],
    ["tweede hoogste bieder", "bieder"],
    ["verkoper", "client-verkoper"],
    ["verkoper (cliënt)", "client-verkoper"],
  ];

  it.each(gevallen)("classificeert %j als %s", (ontvanger, verwacht) => {
    expect(bepaalOntvangerRol(ontvanger)).toBe(verwacht);
  });

  it("valt terug op 'overig' voor een onherkenbaar label", () => {
    expect(bepaalOntvangerRol("ergens anders")).toBe("overig");
  });

  it("herkent 'verkoper' vóór 'koper' (deelstring-val: 'verkoper' bevat 'koper')", () => {
    expect(bepaalOntvangerRol("Verkoper (cliënt)")).toBe("client-verkoper");
  });
});

describe("vulModelbriefIn — geadresseerde-rol", () => {
  it("neemt de afgeleide rol op in het ingevulde resultaat", () => {
    const brief = maakBrief({ id: "b", taal: "nl", ontvanger: "Koper (cliënt)" });
    expect(vulModelbriefIn(brief, {}).rol).toBe("client-koper");
  });
});
