import { describe, it, expect } from "vitest";
import { seedModellen, seedOnderdelen } from "./index";
// Het voorbeeld volgt de ECHTE workflow (opdracht notaris 2026-07-11): deze
// test genereert dus via de demo-dossierketen (lib), niet enkel via de losse
// demo-patronen — precies wat de notaris in de UI te zien krijgt.
import { vulModelVoorbeeldInViaWorkflow as vulModelVoorbeeldIn } from "@/lib/modeldocumenten/voorbeeld-workflow";

// ── Kwaliteitsnazicht van de notaris — model-brede regressies ────────────────
// De notaris las de gegenereerde voorbeeldakten integraal na (NL 2026-07-10,
// FR idem; derde nazicht NL 2026-07-11). Elke assertie hieronder is een
// klasse die toen fout stond in het VOLLEDIG gegenereerde model (niet enkel
// de losse parameterwaarde) — deze test genereert dus het echte model en
// bewaakt dat de klassen weg blijven.

describe("kwaliteitsnazicht — verkoopakte-heldere-taal (NL)", () => {
  const model = seedModellen.find((m) => m.id === "verkoopakte-heldere-taal");
  it("de gemelde klassen blijven weg", () => {
    if (!model) return;
    const f = vulModelVoorbeeldIn(model, seedOnderdelen);
    expect(f).not.toContain("in euro EUR"); // dubbele munteenheid via fallback
    expect(f).not.toContain("3/1.000e EUR"); // voorheffing als breuk
    expect(f).not.toMatch(/verbruik van 20210101|geldig tot 20210101/); // certnummer-lek
    expect(f).not.toMatch(/onder lot \*?\*? ?NV Voorbeeld/); // lot als vennootschap
    expect(f).not.toContain("geantwoord: Leuven"); // antwoord als plaatsnaam
    expect(f).toContain("verkreeg het goed bij akte"); // oorsprong is een alinea
    expect(f).toContain("ingeschreven in het rijksregister onder nummer"); // volledige identiteit comparant
  });

  it("nazicht 3: de identiteit komt uit de canonieke clausule, mét huwelijksgegevens", () => {
    if (!model) return;
    const f = vulModelVoorbeeldIn(model, seedOnderdelen);
    // De canonieke clausule "identiteit-partijen" is de enige die de
    // notariswet respecteert: burgerlijke staat + huwelijksalinea (stelsel,
    // huwelijksovereenkomst, wijzigingen) horen in de verschijning te staan.
    expect(f).toContain("onder het stelsel van scheiding van goederen");
    // Het demo-dossier draagt één latere stelselwijziging — de canonieke
    // clausule schrijft de volledige wijzigingszin uit (echte keten).
    expect(f).toContain("welk stelsel nadien werd gewijzigd bij akte verleden voor notaris Peter Van Hove");
    expect(f).toContain("ingevolge huwelijksovereenkomst verleden voor notaris");
    expect(f).toContain("ongehuwd en geen verklaring van wettelijke samenwoning afgelegd");
  });

  it("nazicht 3: de overige gemelde klassen blijven weg", () => {
    if (!model) return;
    const f = vulModelVoorbeeldIn(model, seedOnderdelen);
    // Geen dubbele verschijningskop: de aanhef eindigt op "ZIJN VERSCHENEN:",
    // daarna volgen direct de partijen (geen tweede "VERSCHIJNEN:"-kop).
    expect(f).toContain("ZIJN VERSCHENEN:");
    expect(f).not.toMatch(/\n#+ ?\d*\.? ?VERSCHIJNEN:/);
    // De aktedatum in de aanhef herhaalt het jaartal niet in cijfers.
    expect(f).toContain("Op vijftien maart.");
    expect(f).not.toMatch(/HET JAAR tweeduizend zesentwintig\.\nOp 15 maart 2026\./);
    // Twee verschillende notarisnamen bij de tweede-notaris-hypothese.
    expect(f).not.toMatch(/meester ([\p{L} ]+), notaris[\s\S]{0,120}?en meester \1/u);
    // GBP-bestemming zonder verdubbeld "-gebied".
    expect(f).not.toContain("woongebied-gebied");
    expect(f).toContain("gelegen is in woongebied");
    // De regelmatige bestemming spoort met een woningverkoop.
    expect(f).not.toContain("bestemming van het goed kantoorruimte");
    // De kostenverdeling van de tank is een afspraak, geen literinhoud.
    expect(f).not.toContain("kostenverdeling worden geregeld als volgt: 1.500");
    // Statuten: "te" + plaats, niet "op" + plaats.
    expect(f).not.toMatch(/door notaris [\p{L} ]+, op Leuven/u);
    // Geen gewestvreemde demo in het voorkooprecht (Vlaamse instantie in een
    // gedeelde Vlaanderen/Brussel-clausule).
    expect(f).not.toContain("De Vlaamse Waterweg");
  });
});

describe("kwaliteitsnazicht — verkoopakte-heldere-taal (FR)", () => {
  const model = seedModellen.find((m) => m.id === "verkoopakte-heldere-taal-fr");
  it("de gemelde klassen blijven weg", () => {
    if (!model) return;
    const f = vulModelVoorbeeldIn(model, seedOnderdelen);
    expect(f).toContain("registre national"); // volledige identiteit comparant
    expect(f).not.toContain("NAKIJKEN"); // geen NL-markeringen in een FR-akte
    expect(f).not.toContain("KIES DE TOEPASSELIJKE");
    expect(f).toContain("HYPOTHÈSE");
    expect(f).not.toMatch(/Le\/L' 3 /); // nature_du_lot-regressie
    expect(f).not.toMatch(/\n3\n/); // description_lot_privatif-regressie
    expect(f).not.toMatch(/Bruxelles dans les parties communes/); // quote-part
    expect(f).toContain("Sécurité juridique"); // kantoor Rechtszekerheid
    expect(f).not.toMatch(/AB123456(er|ème) étage/); // verdiepingsnummers
    expect(f).toContain("mille deux cent cinquante"); // RC voluit
  });

  it("nazicht 3: de identiteit komt uit de canonieke clausule (FR-spiegel), mét huwelijksgegevens", () => {
    if (!model) return;
    const f = vulModelVoorbeeldIn(model, seedOnderdelen);
    expect(f).toContain("inscrit au registre national sous le numéro");
    // De echte keten vertaalt het gangbare stelsel naar het Frans en schrijft
    // de wijziging uit het demo-dossier voluit.
    expect(f).toContain("sous le régime de la séparation de biens");
    expect(f).toContain("régime modifié suivant un acte reçu par le notaire Peter Van Hove");
    expect(f).toContain("non mariée et n'ayant pas fait de déclaration de cohabitation légale");
    // Dezelfde partijen als in het NL-dossier (namen vertalen niet mee), met
    // de Franse tweevormen opgelost naar het gekende geslacht — en geen
    // dubbele comparution-kop na "ONT COMPARU :".
    expect(f).toContain("PEETERS Jan August");
    expect(f).toMatch(/PEETERS Jan August[^,]*, né à/);
    expect(f).toMatch(/JANSSENS Marie Sofie[^,]*, née à/);
    expect(f).toContain("ONT COMPARU :");
    expect(f).not.toMatch(/\n#+ ?\d*\.? ?COMPARAISSENT :/);
  });
});
