import { describe, it, expect } from "vitest";
import { bepaalAkteType } from "./akteType";
import { maakVeld, type Dossier, type Partij } from "./types";

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" }, "kadastraal-uittreksel"),
    prijs: maakVeld(350000, "compromis"),
    ontbrekendeStukken: [],
    tegenstrijdigheden: [],
    aangemaakt: "2026-06-01T00:00:00.000Z",
    aangepast: "2026-06-01T00:00:00.000Z",
    ...overschrijf,
  } as Dossier;
}

describe("bepaalAkteType", () => {
  it("kiest de verkoopakte met zekerheid wanneer er een compromis is", () => {
    const keuze = bepaalAkteType(maakDossier({ compromisdatum: maakVeld("2026-05-12", "compromis") }));
    expect(keuze.akteType).toBe("verkoopakte");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("is onduidelijk tussen compromis en verkoopakte zonder compromisdatum (standaard heldere taal)", () => {
    const keuze = bepaalAkteType(maakDossier({ compromisdatum: undefined }));
    expect(keuze.akteType).toBe("verkoopovereenkomst (compromis) - heldere taal");
    expect(keuze.zekerheid).toBe("onduidelijk");
    expect(keuze.alternatieven).toContain("verkoopakte");
  });

  it("respecteert de expliciete keuze 'compromis' (standaard heldere taal) met zekerheid", () => {
    const keuze = bepaalAkteType(
      maakDossier({ verkoopdocument: "compromis", compromisdatum: maakVeld("2026-05-12", "compromis") })
    );
    expect(keuze.akteType).toBe("verkoopovereenkomst (compromis) - heldere taal");
    expect(keuze.zekerheid).toBe("zeker");
    expect(keuze.alternatieven).toContain("verkoopovereenkomst (compromis)");
  });

  it("respecteert de expliciete keuze 'verkoopakte' met zekerheid, ook zonder compromisdatum", () => {
    const keuze = bepaalAkteType(maakDossier({ verkoopdocument: "verkoopakte", compromisdatum: undefined }));
    expect(keuze.akteType).toBe("verkoopakte");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("behandelt verkoop-met-krediet zoals verkoop-zonder-krediet", () => {
    const metCompromis = bepaalAkteType(
      maakDossier({ dossiertype: "verkoop-met-krediet", compromisdatum: maakVeld("2026-05-12", "compromis") })
    );
    expect(metCompromis.akteType).toBe("verkoopakte");
    expect(metCompromis.zekerheid).toBe("zeker");
  });

  it("kiest de Breyne-compromis met zekerheid bij verkoopRegime 'wet-breyne' + verkoopdocument 'compromis'", () => {
    const keuze = bepaalAkteType(
      maakDossier({ verkoopRegime: "wet-breyne", verkoopdocument: "compromis", compromisdatum: undefined })
    );
    expect(keuze.akteType).toBe("verkoopovereenkomst (compromis) - wet breyne");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("kiest de Breyne-verkoopakte met zekerheid bij verkoopRegime 'wet-breyne' + verkoopdocument 'verkoopakte'", () => {
    const keuze = bepaalAkteType(
      maakDossier({ verkoopRegime: "wet-breyne", verkoopdocument: "verkoopakte", compromisdatum: undefined })
    );
    expect(keuze.akteType).toBe("verkoopakte - wet breyne");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("valt bij verkoopRegime 'wet-breyne' zonder expliciet document terug op de Breyne-akte zodra er al een compromis is", () => {
    const keuze = bepaalAkteType(
      maakDossier({ verkoopRegime: "wet-breyne", compromisdatum: maakVeld("2026-05-12", "compromis") })
    );
    expect(keuze.akteType).toBe("verkoopakte - wet breyne");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("is onduidelijk over het Breyne-document zonder compromisdatum en zonder documentkeuze", () => {
    const keuze = bepaalAkteType(maakDossier({ verkoopRegime: "wet-breyne", compromisdatum: undefined }));
    expect(keuze.akteType).toBe("verkoopovereenkomst (compromis) - wet breyne");
    expect(keuze.zekerheid).toBe("onduidelijk");
    expect(keuze.alternatieven).toContain("verkoopakte - wet breyne");
  });

  it("blijft het gewone verkoopregime kiezen wanneer verkoopRegime ontbreekt", () => {
    const keuze = bepaalAkteType(maakDossier({ compromisdatum: maakVeld("2026-05-12", "compromis") }));
    expect(keuze.akteType).toBe("verkoopakte");
  });

  it("kiest de schenkingsakte (onroerend) met zekerheid bij een schenking van een onroerend goed", () => {
    const keuze = bepaalAkteType(
      maakDossier({ dossiertype: "schenking", goedTypeBelasting: maakVeld("onroerend", "verklaring-partij") })
    );
    expect(keuze.akteType).toBe("schenkingsakte");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("kiest de schenkingsakte (roerend goed) met zekerheid bij een schenking van een roerend goed", () => {
    const keuze = bepaalAkteType(
      maakDossier({ dossiertype: "schenking", goedTypeBelasting: maakVeld("roerend", "verklaring-partij") })
    );
    expect(keuze.akteType).toBe("schenkingsakte-roerend-goed");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("is onduidelijk over roerend/onroerend bij een schenking zonder gekende aard van het goed", () => {
    const keuze = bepaalAkteType(maakDossier({ dossiertype: "schenking" }));
    expect(keuze.akteType).toBe("schenkingsakte");
    expect(keuze.zekerheid).toBe("onduidelijk");
    expect(keuze.alternatieven).toContain("schenkingsakte-roerend-goed");
  });

  it("kiest de aangifte van nalatenschap (zeker) bij een nalatenschapsdossier, met de akte van erfopvolging als bijkomend document", () => {
    const keuze = bepaalAkteType(maakDossier({ dossiertype: "nalatenschap" }));
    expect(keuze.akteType).toBe("aangifte-nalatenschap");
    expect(keuze.zekerheid).toBe("zeker");
    expect(keuze.alternatieven).toContain("akte-erfopvolging");
    expect(keuze.reden).toMatch(/nalatenschap/i);
  });

  it("kiest de aanpassing van de statuten bij een vennootschapsdossier", () => {
    const keuze = bepaalAkteType(maakDossier({ dossiertype: "aanpassing-statuten-vennootschap" }));
    expect(keuze.akteType).toBe("aanpassing-statuten-besloten-vennootschap");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("kiest het keuzetestament bij dossiertype keuzetestament", () => {
    const keuze = bepaalAkteType(maakDossier({ dossiertype: "keuzetestament" }));
    expect(keuze.akteType).toBe("keuzetestament");
    expect(keuze.zekerheid).toBe("zeker");
  });

  it("kiest het testament gezinswoning bij dossiertype testament-gezinswoning", () => {
    const keuze = bepaalAkteType(maakDossier({ dossiertype: "testament-gezinswoning" }));
    expect(keuze.akteType).toBe("testament-gezinswoning-partner-restlegaat-kinderen");
    expect(keuze.zekerheid).toBe("zeker");
  });
});
