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";

// ── Verkoop tegen lijfrente — integratietest (backlog punt 26) ──────────────
// Tweede sub-pad-kandidaat, als toets of het "verkoopRegime"-patroon (zie
// wet-breyne.test.ts) generaliseert naar een structureel andere transactie:
// geen vaste prijs maar een bouquet + periodieke rente, met een voorbehouden
// genotsrecht en een fundamenteel ander fiscaal aanknopingspunt (kanselement).

const PARTIJEN = [
  { naam: "PEETERS", voornaam: "Jan", rol: "verkoper", geslacht: "man", burgerlijkeStaat: "ongehuwd", geboortedatum: "1945-02-20", geboorteplaats: "Mechelen", adres: "Kerkstraat 8, 3080 Tervuren" },
  { naam: "MAES", voornaam: "Sofie", rol: "koper", geslacht: "vrouw", burgerlijkeStaat: "ongehuwd", geboortedatum: "1980-03-03", geboorteplaats: "Leuven", adres: "Dorpsstraat 2, 3000 Leuven" },
];

const GOED = { adres: "Kerkstraat 8, 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-zonder-krediet",
    verkoopRegime: "lijfrente",
    partijen: PARTIJEN,
    goed: GOED,
    lijfrente: { bouquet: 30000, jaarlijkseRente: 6000, frequentie: "maandelijks", genotsrecht: "gebruik-en-bewoning" },
    ...overrides,
  });
  return maakDossierUitIntakeResultaat(resultaat, {
    id: "lijfrente-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("verkoop tegen lijfrente — compromis", () => {
  const dossier = bouwDossier({ verkoopdocument: "compromis" });

  it("kiest het lijfrente-compromismodel (NL en FR) en genereert het document met de gekende gegevens", () => {
    const nl = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(nl.ontwerpakte.akteTypeKeuze.akteType).toBe("verkoopovereenkomst (compromis) - lijfrente");
    expect(nl.ontwerpakte.akteTypeKeuze.zekerheid).toBe("zeker");
    expect(nl.ontwerpakte.model?.id).toBe("verkoopovereenkomst-compromis-lijfrente");
    expect(nl.ontwerpakte.tekst).toContain("ALEATOIR KARAKTER");
    expect(nl.ontwerpakte.tekst).toContain("BOUQUET EN RENTE");
    expect(nl.ontwerpakte.tekst).toContain("30.000");
    expect(nl.ontwerpakte.tekst).toContain("6.000");
    // Genotsrecht "gebruik-en-bewoning" is automatisch gekozen — niet "vrij".
    expect(nl.ontwerpakte.tekst).toContain("RECHT VAN GEBRUIK EN BEWONING");
    expect(nl.ontwerpakte.tekst).not.toContain("De koper heeft de volle eigendom en het volledige genot");

    const fr = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "fr");
    expect(fr.ontwerpakte.model?.id).toBe("verkoopovereenkomst-compromis-lijfrente-fr");
    expect(fr.ontwerpakte.tekst).toContain("CARACTÈRE ALÉATOIRE");
    expect(fr.ontwerpakte.tekst).toContain("DROIT D'USAGE ET D'HABITATION");
  });

  it("kiest zonder bouquet de 'zuivere rente'-variant", () => {
    const zonderBouquet = bouwDossier({ verkoopdocument: "compromis", lijfrente: { jaarlijkseRente: 6000, frequentie: "jaarlijks" } });
    const nl = stelWerkdossierSamenAutonoom(zonderBouquet, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(nl.ontwerpakte.tekst).toContain("RENTE\n");
    expect(nl.ontwerpakte.tekst).not.toContain("BOUQUET EN RENTE");
  });

  it("levert modelmails maar bewust GEEN automatische afrekening (kanselement)", () => {
    const wd = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(wd.modelmails.mails.length).toBeGreaterThan(0);
    expect(wd.afrekening.aktekosten).toBeUndefined();
    expect(wd.afrekening.registratiebelasting).toBeUndefined();
    expect(wd.afrekening.onzekerheden.join(" ")).toContain("kanselement");
  });
});

describe("verkoop tegen lijfrente — verkoopakte", () => {
  it("kiest het lijfrente-aktemodel (NL en FR)", () => {
    const dossier = bouwDossier({ verkoopdocument: "verkoopakte", compromisdatum: "2026-01-15" });
    const nl = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "nl");
    expect(nl.ontwerpakte.akteTypeKeuze.akteType).toBe("verkoopakte - lijfrente");
    expect(nl.ontwerpakte.model?.id).toBe("verkoopakte-lijfrente");
    expect(nl.ontwerpakte.tekst).toContain("FISCALE GRONDSLAG");

    const fr = stelWerkdossierSamenAutonoom(dossier, BIBLIOTHEKEN, "Vlaanderen", "fr");
    expect(fr.ontwerpakte.model?.id).toBe("verkoopakte-lijfrente-fr");
    expect(fr.ontwerpakte.tekst).toContain("ASSIETTE FISCALE");
  });
});
