import { describe, it, expect } from "vitest";
import { stelWerkdossierSamenAutonoom } from "./werkdossier";
import { maakVeld, type Dossier, type Partij } from "./types";
import { seedModellen, seedOnderdelen } from "@/data/modeldocumenten";
import { seedBrieven } from "@/data/modelbrieven";

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

function maakVerkoop(overschrijf: Partial<Dossier> = {}): Dossier {
  const verkoper: Partij = { naam: "Janssens", voornaam: "Marie", rol: "verkoper" };
  const koper: Partij = { naam: "Peeters", voornaam: "Jan", rol: "koper" };
  return {
    id: "d1",
    dossiertype: "verkoop-zonder-krediet",
    status: "compromis-ontvangen",
    partijen: maakVeld([verkoper, koper], "compromis"),
    goed: maakVeld({ adres: "Brusselsesteenweg 100, 3080 Tervuren" }, "kadastraal-uittreksel"),
    prijs: maakVeld(350000, "compromis"),
    compromisdatum: maakVeld("2026-05-12", "compromis"),
    ontbrekendeStukken: [],
    tegenstrijdigheden: [],
    aangemaakt: "2026-06-01T00:00:00.000Z",
    aangepast: "2026-06-01T00:00:00.000Z",
    ...overschrijf,
  } as Dossier;
}

describe("stelWerkdossierSamenAutonoom", () => {
  it("combineert de vier pijlers voor een verkoopdossier", () => {
    const wd = stelWerkdossierSamenAutonoom(maakVerkoop(), bibliotheken, "Vlaanderen");
    expect(wd.ontwerpakte.akteTypeKeuze.akteType).toBe("verkoopakte");
    expect(wd.ontwerpakte.tekst).toBeDefined();
    expect(wd.modelmails.mails.length).toBeGreaterThan(0);
    expect(wd.afrekening.aktekosten).toBeDefined();
    // Vierde pijler: opvolging met route en de uiterste aktedatum uit het compromis.
    expect(wd.opvolging.huidigeStap?.status).toBe("compromis-ontvangen");
    expect(wd.opvolging.termijnen.find((t) => t.id === "uiterste-datum-akte")?.vervaldatum).toBe("2026-09-12");
  });

  it("bundelt de onzekerheden met herkomst per pijler", () => {
    const wd = stelWerkdossierSamenAutonoom(maakVerkoop({ prijs: undefined }), bibliotheken, "Vlaanderen");
    const pijlers = new Set(wd.onzekerheden.map((o) => o.pijler));
    // Geen prijs ⇒ afrekening-onzekerheid moet aanwezig zijn.
    expect(pijlers.has("afrekening")).toBe(true);
    expect(wd.onzekerheden.every((o) => typeof o.boodschap === "string" && o.boodschap.length > 0)).toBe(true);
  });

  it("koppelt een concrete suggestie aan herkenbare onzekerheden", () => {
    // Geen "en"-modelbrief voor de testament-categorie: raakt dezelfde
    // suggestie als een onbekende categorie (bepaalSuggestie in werkdossier.ts).
    const wd = stelWerkdossierSamenAutonoom(
      maakVerkoop({ dossiertype: "keuzetestament", prijs: undefined }),
      bibliotheken,
      "Vlaanderen",
      "en"
    );
    const modelmailOnzekerheid = wd.onzekerheden.find(
      (o) => o.pijler === "modelmails" && /geen modelmail in de bibliotheek/i.test(o.boodschap)
    );
    expect(modelmailOnzekerheid?.suggestie).toMatch(/notaris kiest zelf/i);
  });

  it("verzamelt onzekerheden van alle pijlers bij een testamentdossier", () => {
    const wd = stelWerkdossierSamenAutonoom(
      maakVerkoop({ dossiertype: "keuzetestament", prijs: undefined }),
      bibliotheken,
      "Vlaanderen"
    );
    const pijlers = new Set(wd.onzekerheden.map((o) => o.pijler));
    expect(pijlers.has("modelmails")).toBe(true);
    expect(pijlers.has("afrekening")).toBe(true);
  });
});
