import { describe, it, expect } from "vitest";
import { GET } from "./route";
import { NextRequest } from "next/server";

function maakRequest(query: string): NextRequest {
  return new NextRequest(`http://localhost/api/belasting${query}`);
}

describe("GET /api/belasting", () => {
  it("berekent schenkbelasting (succespad)", async () => {
    const res = GET(
      maakRequest("?soort=schenking&gewest=Vlaanderen&goedType=onroerend&relatie=rechte_lijn_partner&waarde=200000")
    );
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.invoer.soort).toBe("schenking");
    expect(json.resultaat.totaal).toBeGreaterThan(0);
    expect(json.disclaimer).toMatch(/Indicatieve berekening van de schenkbelasting/);
  });

  it("berekent erfbelasting met andereGoederen en isPartner (succespad)", async () => {
    const res = GET(
      maakRequest(
        "?soort=erfenis&gewest=Brussel&goedType=onroerend&relatie=rechte_lijn_partner&waarde=300000&andereGoederen=50000&isPartner=false"
      )
    );
    expect(res.status).toBe(200);
    const json = await res.json();
    expect(json.invoer.soort).toBe("erfenis");
    expect(json.invoer.andereGoederen).toBe(50000);
    expect(json.invoer.isPartner).toBe(false);
    expect(json.resultaat.totaal).toBeGreaterThanOrEqual(0);
  });

  it("geeft 400 bij ontbrekende soort", async () => {
    const res = GET(maakRequest("?relatie=rechte_lijn_partner&waarde=100000"));
    expect(res.status).toBe(400);
    const json = await res.json();
    expect(json.fout).toMatch(/soort/);
  });

  it("geeft 400 bij ongeldige soort", async () => {
    const res = GET(maakRequest("?soort=foo&relatie=rechte_lijn_partner&waarde=100000"));
    expect(res.status).toBe(400);
  });

  it("geeft 400 bij ontbrekende relatie", async () => {
    const res = GET(maakRequest("?soort=schenking&waarde=100000"));
    expect(res.status).toBe(400);
    const json = await res.json();
    expect(json.fout).toMatch(/relatie/);
  });

  it("geeft 400 bij ongeldig gewest", async () => {
    const res = GET(maakRequest("?soort=schenking&gewest=Foo&relatie=anderen&waarde=100000"));
    expect(res.status).toBe(400);
    const json = await res.json();
    expect(json.fout).toMatch(/gewest/);
  });

  it("geeft 400 bij ontbrekende of ongeldige waarde", async () => {
    const res = GET(maakRequest("?soort=schenking&relatie=anderen&waarde=0"));
    expect(res.status).toBe(400);
    const json = await res.json();
    expect(json.fout).toMatch(/waarde/);
  });

  it("geeft 400 bij ongeldige isPartner-waarde", async () => {
    const res = GET(
      maakRequest("?soort=erfenis&relatie=rechte_lijn_partner&waarde=100000&isPartner=misschien")
    );
    expect(res.status).toBe(400);
    const json = await res.json();
    expect(json.fout).toMatch(/isPartner/);
  });
});
