import { describe, it, expect } from "vitest";
import { POST } from "./route";

function maakRequest(body: unknown): Request {
  return new Request("http://localhost/api/dossier/termijnen", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });
}

describe("POST /api/dossier/termijnen", () => {
  it("berekent kredietvervaldag én uiterste aktedatum uit compromisdatum + krediettermijn", async () => {
    const res = await POST(maakRequest({ compromisdatum: "2026-05-12", krediettermijnWeken: 4, vandaag: "2026-06-01" }));
    expect(res.status).toBe(200);
    const json = await res.json();
    const ids = json.termijnen.map((t: { id: string }) => t.id);
    expect(ids).toEqual(["opschortende-voorwaarde-krediet", "uiterste-datum-akte"]);
    expect(json.termijnen[0].vervaldatum).toBe("2026-06-09"); // +4 weken
    expect(json.termijnen[1].vervaldatum).toBe("2026-09-12"); // +4 maanden
    expect(json.termijnen[0].dagenResterend).toBe(8);
    expect(json.urgentie.niveau).toBe("nabij");
    expect(json.referentiedatum).toBe("2026-06-01");
  });

  it("markeert een verstreken krediettermijn als 'verstreken' met de dringendste termijn", async () => {
    const res = await POST(maakRequest({ compromisdatum: "2026-05-12", krediettermijnWeken: 4, vandaag: "2026-06-15" }));
    const json = await res.json();
    expect(json.urgentie.niveau).toBe("verstreken");
    expect(json.urgentie.termijn.id).toBe("opschortende-voorwaarde-krediet");
    expect(json.onzekerheden.some((o: string) => /verstreken/.test(o))).toBe(true);
  });

  it("laat de kredietvervaldag weg zodra het krediet aanvaard is (voorwaarde vervuld)", async () => {
    const res = await POST(maakRequest({ compromisdatum: "2026-05-12", krediettermijnWeken: 4, kredietAanvaard: true, vandaag: "2026-06-01" }));
    const json = await res.json();
    expect(json.termijnen.map((t: { id: string }) => t.id)).toEqual(["uiterste-datum-akte"]);
  });

  it("werkt zonder kredietgegevens (verkoop zonder krediet): enkel de uiterste aktedatum", async () => {
    const res = await POST(maakRequest({ compromisdatum: "2026-05-12", vandaag: "2026-06-01" }));
    const json = await res.json();
    expect(json.termijnen.map((t: { id: string }) => t.id)).toEqual(["uiterste-datum-akte"]);
    expect(json.urgentie.niveau).toBe("ok");
  });

  it("weigert een ontbrekende of niet-ISO compromisdatum met een duidelijke boodschap", async () => {
    for (const body of [{}, { compromisdatum: "12 mei 2026" }]) {
      const res = await POST(maakRequest(body));
      expect(res.status).toBe(400);
      const json = await res.json();
      expect(json.fout).toContain("compromisdatum");
    }
  });

  it("weigert een ongeldige krediettermijn of referentiedatum", async () => {
    expect((await POST(maakRequest({ compromisdatum: "2026-05-12", krediettermijnWeken: -1 }))).status).toBe(400);
    expect((await POST(maakRequest({ compromisdatum: "2026-05-12", vandaag: "morgen" }))).status).toBe(400);
  });
});
