import { describe, it, expect } from "vitest";
import { dossierVeldenUitIntake, maakDossierUitIntakeResultaat, DOSSIER_INTAKE_SCHEMA } from "./intake";
import { stelWerkdossierSamenAutonoom } from "./werkdossier";
import { seedModellen, seedOnderdelen } from "@/data/modeldocumenten";
import { seedBrieven } from "@/data/modelbrieven";

// ── Wet Breyne — integratietest (backlog punten 22-24) ───────────────────────
// Bewaakt dat het sub-pad "verkoopRegime: wet-breyne" (lib/dossier/types.ts;
// detectie in akteType.ts, al getest in akteType.test.ts) ook effectief tot
// een gegenereerd document, modelmails en een afrekening leidt via de
// volledige autonome motor. Geen ratchet-registratie in GOUDEN_PADEN — dat is
// de afzonderlijke, mechanische vervolgwerf (ARCHITECTURE.md, backlog punt 27)
// zodra ook het manuele UI-toggle (punt 25) er is.

const PARTIJEN = [
  { naam: "PEETERS", voornaam: "Jan", rol: "koper", geslacht: "man", burgerlijkeStaat: "ongehuwd", geboortedatum: "1985-02-20", geboorteplaats: "Mechelen", adres: "Kerkstraat 8, 3080 Tervuren" },
  { naam: "IMMO TERVUREN NV", rol: "verkoper" },
];

const GOED = { adres: "Verkaveling Nieuwbouw 1, 3080 Tervuren", type: "woning", gemeente: "Tervuren", sectie: "C", perceelnummer: "88/B" };

function bouwDossier(overrides: Record<string, unknown>) {
  const resultaat = dossierVeldenUitIntake({
    schema: DOSSIER_INTAKE_SCHEMA,
    dossiertype: "verkoop-met-krediet",
    partijen: PARTIJEN,
    goed: GOED,
    prijs: 395000,
    voorschot: 19750,
    ...overrides,
  });
  return maakDossierUitIntakeResultaat(resultaat, {
    id: "wet-breyne-test",
    status: "ontwerp-in-opmaak",
    aangemaakt: "2026-07-04T00:00:00.000Z",
    aangepast: "2026-07-04T00:00:00.000Z",
  });
}

const BIBLIOTHEKEN = { modellen: seedModellen, onderdelen: seedOnderdelen, brieven: seedBrieven };

describe("wet Breyne — compromis", () => {
  const dossier = bouwDossier({ verkoopdocument: "compromis", verkoopRegime: "wet-breyne" });

  it("kiest het Breyne-compromismodel (NL en FR) en genereert het document", () => {
    const nl = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(nl.ontwerpakte.akteTypeKeuze.akteType).toBe("verkoopovereenkomst (compromis) - wet breyne");
    expect(nl.ontwerpakte.akteTypeKeuze.zekerheid).toBe("zeker");
    expect(nl.ontwerpakte.model?.id).toBe("verkoopovereenkomst-compromis-wet-breyne");
    // De "compromis"-variant is automatisch geselecteerd (dossierNaarKeuzes) —
    // geen open [KIES DE HYPOTHESE]-blok voor het toepassingsgebied.
    expect(nl.ontwerpakte.tekst).toContain("TOEPASSING VAN DE WET BREYNE");
    expect(nl.ontwerpakte.tekst).toContain("artikel 2 van de wet Breyne geen enkele betaling");
    // De "compromis"-variant van de betaling verschijnt, niet de "akte"-variant.
    expect(nl.ontwerpakte.tekst).toContain("VOORSCHOT (ART. 5 WET BREYNE)");
    expect(nl.ontwerpakte.tekst).not.toContain("REEDS BETAALD VOORSCHOT");

    const fr = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "fr");
    expect(fr.ontwerpakte.model?.id).toBe("verkoopovereenkomst-compromis-wet-breyne-fr");
    expect(fr.ontwerpakte.tekst).toContain("APPLICATION DE LA LOI BREYNE");
  });

  it("levert modelmails en een afrekening (met de Breyne-toelichting)", () => {
    const wd = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(wd.modelmails.mails.length).toBeGreaterThan(0);
    expect(wd.afrekening.aktekosten).toBeDefined();
    expect(wd.afrekening.registratiebelasting).toBeDefined();
    expect(wd.afrekening.onzekerheden.join(" ")).toContain("Wet Breyne");
  });
});

describe("wet Breyne — verkoopakte", () => {
  const dossier = bouwDossier({ verkoopdocument: "verkoopakte", verkoopRegime: "wet-breyne", compromisdatum: "2026-01-15" });

  it("kiest het Breyne-aktemodel (NL en FR) met de akte-variant van de betaling", () => {
    const nl = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(nl.ontwerpakte.akteTypeKeuze.akteType).toBe("verkoopakte - wet breyne");
    expect(nl.ontwerpakte.model?.id).toBe("verkoopakte-wet-breyne");
    expect(nl.ontwerpakte.tekst).toContain("BETALING PER BOUWFASE");
    expect(nl.ontwerpakte.tekst).toContain("TIENJARIGE AANSPRAKELIJKHEID");
    expect(nl.ontwerpakte.tekst).toContain("395.000");

    const fr = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "fr");
    expect(fr.ontwerpakte.model?.id).toBe("verkoopakte-wet-breyne-fr");
    expect(fr.ontwerpakte.tekst).toContain("PAIEMENT PAR PHASE DE CONSTRUCTION");
  });

  it("heeft een afrekening op de volledige prijs (ereloon/verkooprecht ongewijzigd door het betalingsritme)", () => {
    const wd = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(wd.afrekening.aktekosten?.honorarium).toBeGreaterThan(0);
    expect(wd.afrekening.registratiebelasting?.bedrag).toBeGreaterThan(0);
  });
});
