import { describe, it, expect } from "vitest";
import { stelOntwerpakteSamenAutonoom } from "./autonoom";
import { maakVeld, type Dossier, type Partij } from "./types";
import { seedModellen, seedOnderdelen, type Modeldocument } from "@/data/modeldocumenten";

function maakDossier(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", type: "woning" }, "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("stelOntwerpakteSamenAutonoom", () => {
  it("genereert een werkdocument voor een verkoopdossier met compromisdatum", () => {
    const resultaat = stelOntwerpakteSamenAutonoom(maakDossier(), seedModellen, seedOnderdelen, "Vlaanderen");
    expect(resultaat.akteTypeKeuze.akteType).toBe("verkoopakte");
    expect(resultaat.akteTypeKeuze.zekerheid).toBe("zeker");
    expect(resultaat.model).toBeDefined();
    expect(resultaat.model?.akteType).toBe("verkoopakte");
    expect(resultaat.tekst).toBeDefined();
    expect(resultaat.tekst).toContain("Janssens");
  });

  it("stelt de aangifte van nalatenschap op bij een nalatenschapsdossier (gouden pad gedicht)", () => {
    const resultaat = stelOntwerpakteSamenAutonoom(
      maakDossier({ dossiertype: "nalatenschap" }),
      seedModellen,
      seedOnderdelen,
      "Vlaanderen"
    );
    expect(resultaat.akteTypeKeuze.akteType).toBe("aangifte-nalatenschap");
    expect(resultaat.akteTypeKeuze.zekerheid).toBe("zeker");
    expect(resultaat.model?.akteType).toBe("aangifte-nalatenschap");
    expect(resultaat.tekst).toBeDefined();
  });

  it("signaleert een ontbrekend modeldocument in de bibliotheek", () => {
    const resultaat = stelOntwerpakteSamenAutonoom(maakDossier(), [] as Modeldocument[], seedOnderdelen, "Vlaanderen");
    expect(resultaat.akteTypeKeuze.akteType).toBe("verkoopakte");
    expect(resultaat.model).toBeUndefined();
    expect(resultaat.tekst).toBeUndefined();
    expect(resultaat.onzekerheden.some((o) => /geen modeldocument gevonden/i.test(o))).toBe(true);
  });

  it("signaleert niet-afleidbare parameters en open hypothesekeuzes in de gegenereerde tekst", () => {
    const dossierZonderGoed = maakDossier({ goed: undefined, prijs: undefined });
    const resultaat = stelOntwerpakteSamenAutonoom(dossierZonderGoed, seedModellen, seedOnderdelen, "Vlaanderen");
    expect(resultaat.tekst).toBeDefined();
    expect(resultaat.onzekerheden.length).toBeGreaterThan(0);
  });
});
