import { describe, it, expect } from "vitest";
import { dossierNaarModelbriefWaarden } from "./modelbriefParameters";
import { maakVeld, type Dossier } from "./types";

function maakDossier(overschrijf: Partial<Dossier> = {}): Dossier {
  return {
    id: "d1",
    dossiertype: "verkoop-zonder-krediet",
    status: "compromis-ontvangen",
    partijen: maakVeld(
      [
        { naam: "Janssens", voornaam: "Marie", rol: "verkoper" },
        { naam: "Peeters", voornaam: "Jan", rol: "koper" },
      ],
      "compromis"
    ),
    goed: maakVeld({ adres: "Brusselsesteenweg 100, 3080 Tervuren", kadastraleGegevens: "Tervuren 1e afd." }, "eigendomstitel"),
    prijs: maakVeld(350000, "compromis"),
    ontbrekendeStukken: ["hyp-attest", "stedenbouw"],
    tegenstrijdigheden: [],
    aangemaakt: "2026-01-01T00:00:00.000Z",
    aangepast: "2026-01-01T00:00:00.000Z",
    ...overschrijf,
  } as Dossier;
}

describe("dossierNaarModelbriefWaarden", () => {
  it("vult rolgebonden namen in", () => {
    const w = dossierNaarModelbriefWaarden(maakDossier());
    expect(w.naam_verkoper).toBe("Marie Janssens");
    expect(w.naam_koper).toBe("Jan Peeters");
  });

  it("vult generieke naam enkel bij precies één partij", () => {
    const w = dossierNaarModelbriefWaarden(maakDossier());
    expect(w.naam).toBeUndefined();

    const enkelVerkoper = maakDossier({
      partijen: maakVeld([{ naam: "Janssens", voornaam: "Marie", rol: "verkoper" }], "compromis"),
    });
    expect(dossierNaarModelbriefWaarden(enkelVerkoper).naam).toBe("Marie Janssens");
  });

  it("formatteert de verkoopprijs", () => {
    const w = dossierNaarModelbriefWaarden(maakDossier());
    expect(w.verkoopprijs).toContain("350.000");
  });

  it("vult de kantoorgegevens (standplaats, notaris) in elke mail in", () => {
    const w = dossierNaarModelbriefWaarden(maakDossier());
    expect(w.standplaats).toBe("Tervuren");
    expect(w.naam_notaris).toBeTruthy();
  });

  it("vult de referte in vanuit de kantoorreferentie", () => {
    expect(dossierNaarModelbriefWaarden(maakDossier({ referentie: "2026/0123" })).referte).toBe("2026/0123");
    expect(dossierNaarModelbriefWaarden(maakDossier()).referte).toBeUndefined();
  });

  it("lijst de ontbrekende stukken op", () => {
    const w = dossierNaarModelbriefWaarden(maakDossier());
    expect(w.op_te_vragen_stukken).toContain("Hypotheekattest");
    expect(w.op_te_vragen_stukken).toContain("Stedenbouwkundige inlichtingen");
  });

  it("laat hyp-attest weg uit de lijst wanneer de hypothecaire lasten gekend zijn", () => {
    const metHypAttest = maakDossier({
      hypothecaireLasten: maakVeld([], "hypotheekattest"),
    });
    const w = dossierNaarModelbriefWaarden(metHypAttest);
    expect(w.op_te_vragen_stukken).not.toContain("Hypotheekattest");
  });
});
