import { describe, it, expect } from "vitest";
import { berekenOntbrekendeStukken, stukLabel } from "./afleiding";
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" }], "compromis"),
    goed: maakVeld({ adres: "Brusselsesteenweg 100, 3080 Tervuren" }, "eigendomstitel"),
    prijs: maakVeld(350000, "compromis"),
    ontbrekendeStukken: [],
    tegenstrijdigheden: [],
    aangemaakt: "2026-01-01T00:00:00.000Z",
    aangepast: "2026-01-01T00:00:00.000Z",
    ...overschrijf,
  } as Dossier;
}

describe("berekenOntbrekendeStukken", () => {
  it("rapporteert alle verplichte stukken als ontbrekend bij een leeg dossier", () => {
    const ontbrekend = berekenOntbrekendeStukken(maakDossier());
    expect(ontbrekend).toEqual(["hyp-attest", "kad-uittreksel", "stedenbouw", "bodem-vl"]);
  });

  it("laat stedenbouw weg wanneer de inlichtingen effectief ontvangen werden", () => {
    const dossier = maakDossier({
      stedenbouwInlichtingenOntvangen: maakVeld(true, "stedenbouwkundige-inlichtingen"),
    });
    expect(berekenOntbrekendeStukken(dossier)).not.toContain("stedenbouw");
  });

  it("blijft stedenbouw als ontbrekend rapporteren wanneer het veld op false staat", () => {
    const dossier = maakDossier({
      stedenbouwInlichtingenOntvangen: maakVeld(false, "stedenbouwkundige-inlichtingen"),
    });
    expect(berekenOntbrekendeStukken(dossier)).toContain("stedenbouw");
  });

  it("telt attestgegevens uit de intake als ontvangen stuk (stedenbouw en bodem)", () => {
    const dossier = maakDossier({
      attesten: {
        stedenbouw: { datum: "2026-04-10", bestemming: "woongebied" },
        bodem: { datum: "2026-05-02", inhoud: "blanco" },
      },
    });
    const ontbrekend = berekenOntbrekendeStukken(dossier);
    expect(ontbrekend).not.toContain("stedenbouw");
    expect(ontbrekend).not.toContain("bodem-vl");
    expect(ontbrekend).toContain("hyp-attest"); // nog steeds eerlijk ontbrekend
  });

  it("rapporteert geen ontbrekende stukken voor schenking/nalatenschap (nog niet gemodelleerd)", () => {
    const schenking = maakDossier({ dossiertype: "schenking", goed: undefined, prijs: undefined });
    const nalatenschap = maakDossier({ dossiertype: "nalatenschap", goed: undefined, prijs: undefined });
    expect(berekenOntbrekendeStukken(schenking)).toEqual([]);
    expect(berekenOntbrekendeStukken(nalatenschap)).toEqual([]);
  });
});

describe("stukLabel", () => {
  it("geeft het Nederlandse label voor gekende stuk-ids", () => {
    expect(stukLabel("stedenbouw")).toBe("Stedenbouwkundige inlichtingen");
  });

  it("valt terug op het id zelf voor onbekende ids", () => {
    expect(stukLabel("onbekend-id")).toBe("onbekend-id");
  });
});
