// @vitest-environment jsdom
import { describe, it, expect, beforeEach } from "vitest";
// ── Cross-module handoff: het rondje schrijf → lees per brug ─────────────────
// Elke brug (belasting→ereloon, dossier→ereloon/modeldocumenten/modelbrieven/
// belasting, modeldocumenten→AI-prompts) loopt over dezelfde fabriek; deze
// test bewaakt per brug het round-trip-gedrag, de eenmaligheid (lezen wist)
// en de afwijzing van onbruikbare inhoud — zodat een module nooit met een
// half-geldige handoff opstart.
import {
  schrijfSchenkingHandoff,
  leesSchenkingHandoff,
  schrijfModeldocumentHandoff,
  leesModeldocumentHandoff,
  schrijfAktekostenHandoff,
  leesAktekostenHandoff,
  schrijfOntwerpakteHandoff,
  leesOntwerpakteHandoff,
  schrijfModelbriefHandoff,
  leesModelbriefHandoff,
  schrijfBelastingHandoff,
  leesBelastingHandoff,
  type AktekostenHandoff,
  type OntwerpakteHandoff,
} from "./handoff";

beforeEach(() => sessionStorage.clear());

describe("round-trip en eenmaligheid per brug", () => {
  it("schenking: belasting → ereloon", () => {
    schrijfSchenkingHandoff({ akteType: "schenking-onroerend", bedrag: "250000", relatie: "rechte_lijn_partner", aantalSchenkers: 2 });
    expect(leesSchenkingHandoff()).toMatchObject({ akteType: "schenking-onroerend", bedrag: "250000", aantalSchenkers: 2 });
    expect(leesSchenkingHandoff()).toBeNull(); // eenmalig: lezen wist
  });

  it("modeldocument: modeldocumenten → AI-prompts", () => {
    schrijfModeldocumentHandoff({ titel: "Compromis", tekst: "TEKST" });
    expect(leesModeldocumentHandoff()).toEqual({ titel: "Compromis", tekst: "TEKST" });
    expect(leesModeldocumentHandoff()).toBeNull();
  });

  it("aktekosten: dossier → ereloon, voor élk actief akteType (ook de kredietakte)", () => {
    const hypotheek: AktekostenHandoff = { akteType: "hypotheek", bedrag: "300000" };
    schrijfAktekostenHandoff(hypotheek);
    expect(leesAktekostenHandoff()).toEqual(hypotheek);
    const verkoop: AktekostenHandoff = { akteType: "verkoop", bedrag: "395000" };
    schrijfAktekostenHandoff(verkoop);
    expect(leesAktekostenHandoff()).toEqual(verkoop);
  });

  it("ontwerpakte: dossier → modeldocumenten, met keuzes en partij-herhalingen", () => {
    const h: OntwerpakteHandoff = {
      akteType: "verkoopakte",
      parameterwaarden: { prijs_cijfers: "395.000" },
      dossierLabel: "Bosstraat 45",
      partijHerhalingen: [{ label: "Verkoper", waarden: { naam_voluit: "PEETERS Jan" } }],
      keuzes: [{ onderdeelId: "administratieve-attesten", variantId: "vlaanderen", conditieBevestigd: true }],
    };
    schrijfOntwerpakteHandoff(h);
    expect(leesOntwerpakteHandoff()).toEqual(h);
  });

  it("modelbrief: dossier → modelbrieven", () => {
    schrijfModelbriefHandoff({ categorie: "akteontwerp", parameterwaarden: {}, dossierLabel: "2026/0456" });
    expect(leesModelbriefHandoff()).toMatchObject({ categorie: "akteontwerp" });
  });

  it("belasting: dossier → belasting, met defaults voor ontbrekende enums", () => {
    schrijfBelastingHandoff({ bedrag: "500000", relatie: "rechte_lijn_partner", goedType: "gezinswoning", dossierLabel: "Nalatenschap X" });
    expect(leesBelastingHandoff()).toMatchObject({ bedrag: "500000", goedType: "gezinswoning" });
  });
});

describe("afwijzing van onbruikbare inhoud (validator per brug)", () => {
  it("weigert een aktekosten-handoff met een niet-actief of onbekend akteType", () => {
    sessionStorage.setItem("notaryai_aktekosten_handoff", JSON.stringify({ akteType: "bestaat-niet", bedrag: "1" }));
    expect(leesAktekostenHandoff()).toBeNull();
  });

  it("weigert corrupte JSON en wist de sleutel toch (geen herhaalde fout)", () => {
    sessionStorage.setItem("notaryai_ontwerpakte_handoff", "{kapot");
    expect(leesOntwerpakteHandoff()).toBeNull();
  });

  it("weigert een handoff zonder verplicht veld", () => {
    sessionStorage.setItem("notaryai_modelbrief_handoff", JSON.stringify({ parameterwaarden: {} }));
    expect(leesModelbriefHandoff()).toBeNull();
    sessionStorage.setItem("notaryai_schenking_handoff", JSON.stringify({ akteType: "verkoop" }));
    expect(leesSchenkingHandoff()).toBeNull();
  });

  it("geeft null bij een lege opslag", () => {
    expect(leesAktekostenHandoff()).toBeNull();
    expect(leesBelastingHandoff()).toBeNull();
  });
});
