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

const MODEL_ID = "verkoopovereenkomst-compromis";

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

function maakParams(id = MODEL_ID): { params: Promise<{ id: string }> } {
  return { params: Promise.resolve({ id }) };
}

describe("POST /api/modeldocumenten/[id]/ontwerp", () => {
  it("leidt de hypotheses deterministisch af uit de kenmerken", async () => {
    const res = await POST(maakRequest({ kenmerken: { gewest: "Vlaanderen", goedType: "appartement", metKrediet: true } }), maakParams());
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.modeldocumentId).toBe(MODEL_ID);
    expect(json.toegepasteKeuzes).toContainEqual({ onderdeelId: "beschrijving-onroerend-goed", variantId: "appartement-mede-eigendom" });
    expect(json.toegepasteKeuzes).toContainEqual({ onderdeelId: "opschortende-voorwaarde-financiering", opnemen: true });
    expect(typeof json.tekst).toBe("string");
    expect(json.tekst.toLowerCase()).toContain("mede-eigendom");
    expect(json.problemen).toEqual([]);
  });

  it("meldt een onbekende kenmerkwaarde zonder te falen", async () => {
    const res = await POST(maakRequest({ kenmerken: { goedType: "kasteel" } }), maakParams());
    const json = await res.json();
    expect(json.problemen.some((p: string) => /goedType/.test(p))).toBe(true);
  });

  it("404 bij onbekend model-id", async () => {
    const res = await POST(maakRequest({ kenmerken: {} }), maakParams("bestaat-niet"));
    expect(res.status).toBe(404);
  });

  it("400 bij ongeldige JSON", async () => {
    const req = new Request(`http://localhost/api/modeldocumenten/${MODEL_ID}/ontwerp`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: "{ niet-geldig",
    });
    const res = await POST(req, maakParams());
    expect(res.status).toBe(400);
  });
});
