// ── API: indicatieve schenk- en erfbelasting ─────────────────────────────────
// Dunne schil rond berekenSchenking/berekenErfenis (data/belastingen.ts) — de
// enige bron van waarheid voor de progressieve tarieven, abattementen en
// gunsttarieven per gewest. Eén parametrische route (?soort=schenking|erfenis),
// naar analogie van /api/opzoekingen, omdat beide berekeningen gewest/goedType/
// relatie/waarde delen en slechts in de laatste, optionele parameters verschillen.

import { type NextRequest, NextResponse } from "next/server";
import {
  berekenSchenking,
  berekenErfenis,
  relatieOpties,
  BELASTINGEN_META,
  type Relatie,
  type GoedeType,
} from "@/data/belastingen";
import type { Gewest } from "@/lib/context/gewest";
import { parseBedragInvoer } from "@/lib/format";

const SOORTEN = ["schenking", "erfenis"] as const;
type Soort = (typeof SOORTEN)[number];

const GEWESTEN: Gewest[] = ["Vlaanderen", "Brussel", "Wallonië"];
const GOED_TYPEN: GoedeType[] = ["roerend", "onroerend", "gezinswoning"];

function fout(boodschap: string) {
  return NextResponse.json({ fout: boodschap }, { status: 400 });
}

export function GET(request: NextRequest) {
  const q = request.nextUrl.searchParams;

  const soort = q.get("soort") as Soort | null;
  if (!soort || !SOORTEN.includes(soort)) {
    return fout(`Parameter "soort" vereist — één van: ${SOORTEN.join(", ")}.`);
  }

  const gewest = (q.get("gewest") ?? "Vlaanderen") as Gewest;
  if (!GEWESTEN.includes(gewest)) {
    return fout(`Parameter "gewest" — één van: ${GEWESTEN.join(", ")}.`);
  }

  const goedType = (q.get("goedType") ?? "onroerend") as GoedeType;
  if (!GOED_TYPEN.includes(goedType)) {
    return fout(`Parameter "goedType" — één van: ${GOED_TYPEN.join(", ")}.`);
  }

  const relatie = q.get("relatie") as Relatie | null;
  if (!relatie || !relatieOpties.includes(relatie)) {
    return fout(`Parameter "relatie" vereist — één van: ${relatieOpties.join(", ")}.`);
  }

  // API-veilige variant: "250000.5" is hier een decimaal getal, geen
  // duizendtal-notatie (parseBedrag zou er 2.500.005 van maken).
  const waarde = parseBedragInvoer(q.get("waarde") ?? "");
  if (waarde <= 0) {
    return fout('Parameter "waarde" vereist — positief bedrag in euro (bv. 350000).');
  }

  if (soort === "schenking") {
    const resultaat = berekenSchenking(gewest, goedType, relatie, waarde);
    return NextResponse.json({
      invoer: { soort, gewest, goedType, relatie, waarde },
      disclaimer:
        "Indicatieve berekening van de schenkbelasting op basis van de officiële barema's " +
        `(geldig vanaf ${BELASTINGEN_META.geldigVanaf}; bron: ${BELASTINGEN_META.bron}). ` +
        "Gunsttarieven, vrijstellingen en eerdere schenkingen binnen de verdachte periode zijn " +
        "niet automatisch verrekend. Raadpleeg het notariskantoor te Tervuren voor een definitieve berekening.",
      resultaat,
    });
  }

  const andereGoederenRaw = q.get("andereGoederen");
  const andereGoederen = andereGoederenRaw ? parseBedragInvoer(andereGoederenRaw) : 0;
  if (andereGoederenRaw && andereGoederen < 0) {
    return fout('Parameter "andereGoederen" — bedrag in euro ≥ 0 (bv. 0 of 100000).');
  }

  const isPartnerRaw = q.get("isPartner");
  if (isPartnerRaw !== null && isPartnerRaw !== "true" && isPartnerRaw !== "false") {
    return fout('Parameter "isPartner" — "true" of "false".');
  }
  const isPartner = isPartnerRaw === null ? true : isPartnerRaw === "true";

  const resultaat = berekenErfenis(gewest, relatie, waarde, andereGoederen, goedType, isPartner);
  return NextResponse.json({
    invoer: { soort, gewest, goedType, relatie, waarde, andereGoederen, isPartner },
    disclaimer:
      "Indicatieve berekening van de erfbelasting op basis van de officiële barema's en gunsttarieven " +
      `(geldig vanaf ${BELASTINGEN_META.geldigVanaf}; bron: ${BELASTINGEN_META.bron}). ` +
      "Raadpleeg het notariskantoor te Tervuren voor een definitieve berekening.",
    resultaat,
  });
}
