import type { Gewest } from "@/lib/context/gewest";

export type Relatie =
  | "rechte_lijn_partner"
  | "broers_zussen"
  | "ooms_nichten"
  | "anderen";

export type GoedeType = "roerend" | "onroerend";

export interface Schijf {
  van: number;
  tot: number | null;
  tarief: number;
}

export interface WetRef {
  wetId: string;
  artikelId: string;
  label: string;
}

export const relatieLabels: Record<Relatie, string> = {
  rechte_lijn_partner: "Rechte lijn / partner / samenwonende",
  broers_zussen: "Broers en zussen",
  ooms_nichten: "Ooms, tantes, neven, nichten",
  anderen: "Anderen (niet-verwanten)",
};

// Korte labels voor de redenering (zoals in de notaristool)
export const relatieKort: Record<Relatie, string> = {
  rechte_lijn_partner: "rechte lijn",
  broers_zussen: "broers en zussen",
  ooms_nichten: "ooms/tantes en neven/nichten",
  anderen: "andere personen",
};

// ════════════════════════════════════════════════════════════════
// BAREMA'S — afgestemd op de tool van het notariskantoor te Tervuren
// Bronnen: Wikifin 13/04/2026 · Nagelmackers 01/01/2026 · tarieven 2026
// ════════════════════════════════════════════════════════════════

// ── Schenkbelasting ONROEREND ──────────────────────────────────
// Geharmoniseerd barema: identiek in de drie gewesten.
const SCHENK_ONROEREND_RECHTE_LIJN: Schijf[] = [
  { van: 0, tot: 150000, tarief: 3 },
  { van: 150000, tot: 250000, tarief: 9 },
  { van: 250000, tot: 450000, tarief: 18 },
  { van: 450000, tot: null, tarief: 27 },
];
const SCHENK_ONROEREND_ANDEREN: Schijf[] = [
  { van: 0, tot: 150000, tarief: 10 },
  { van: 150000, tot: 250000, tarief: 20 },
  { van: 250000, tot: 450000, tarief: 30 },
  { van: 450000, tot: null, tarief: 40 },
];

function schenkOnroerendSchijven(relatie: Relatie): Schijf[] {
  return relatie === "rechte_lijn_partner"
    ? SCHENK_ONROEREND_RECHTE_LIJN
    : SCHENK_ONROEREND_ANDEREN;
}

// ── Schenkbelasting ROEREND ────────────────────────────────────
// Vast tarief per gewest en verwantschap.
const SCHENK_ROEREND: Record<Gewest, Record<Relatie, number>> = {
  Vlaanderen: { rechte_lijn_partner: 3, broers_zussen: 7, ooms_nichten: 7, anderen: 7 },
  Brussel: { rechte_lijn_partner: 3, broers_zussen: 7, ooms_nichten: 7, anderen: 7 },
  Wallonië: { rechte_lijn_partner: 3.3, broers_zussen: 5.5, ooms_nichten: 5.5, anderen: 5.5 },
};

// ── Erfbelasting ───────────────────────────────────────────────
const ERFBELASTING: Record<Gewest, Record<Relatie, Schijf[]>> = {
  Vlaanderen: {
    rechte_lijn_partner: [
      { van: 0, tot: 50000, tarief: 3 },
      { van: 50000, tot: 250000, tarief: 9 },
      { van: 250000, tot: null, tarief: 27 },
    ],
    broers_zussen: [
      { van: 0, tot: 35000, tarief: 25 },
      { van: 35000, tot: 75000, tarief: 30 },
      { van: 75000, tot: null, tarief: 55 },
    ],
    ooms_nichten: [
      { van: 0, tot: 35000, tarief: 25 },
      { van: 35000, tot: 75000, tarief: 45 },
      { van: 75000, tot: null, tarief: 55 },
    ],
    anderen: [
      { van: 0, tot: 35000, tarief: 25 },
      { van: 35000, tot: 75000, tarief: 45 },
      { van: 75000, tot: null, tarief: 55 },
    ],
  },
  Brussel: {
    rechte_lijn_partner: [
      { van: 0, tot: 50000, tarief: 3 },
      { van: 50000, tot: 100000, tarief: 8 },
      { van: 100000, tot: 175000, tarief: 9 },
      { van: 175000, tot: 250000, tarief: 18 },
      { van: 250000, tot: 500000, tarief: 24 },
      { van: 500000, tot: null, tarief: 30 },
    ],
    broers_zussen: [
      { van: 0, tot: 12500, tarief: 20 },
      { van: 12500, tot: 25000, tarief: 25 },
      { van: 25000, tot: 50000, tarief: 30 },
      { van: 50000, tot: 100000, tarief: 40 },
      { van: 100000, tot: 175000, tarief: 55 },
      { van: 175000, tot: 250000, tarief: 60 },
      { van: 250000, tot: null, tarief: 65 },
    ],
    ooms_nichten: [
      { van: 0, tot: 50000, tarief: 35 },
      { van: 50000, tot: 100000, tarief: 50 },
      { van: 100000, tot: 175000, tarief: 60 },
      { van: 175000, tot: null, tarief: 70 },
    ],
    anderen: [
      { van: 0, tot: 50000, tarief: 40 },
      { van: 50000, tot: 75000, tarief: 55 },
      { van: 75000, tot: 175000, tarief: 65 },
      { van: 175000, tot: null, tarief: 80 },
    ],
  },
  Wallonië: {
    rechte_lijn_partner: [
      { van: 0, tot: 12500, tarief: 3 },
      { van: 12500, tot: 25000, tarief: 4 },
      { van: 25000, tot: 50000, tarief: 5 },
      { van: 50000, tot: 100000, tarief: 7 },
      { van: 100000, tot: 150000, tarief: 10 },
      { van: 150000, tot: 200000, tarief: 14 },
      { van: 200000, tot: 250000, tarief: 18 },
      { van: 250000, tot: 500000, tarief: 24 },
      { van: 500000, tot: null, tarief: 30 },
    ],
    broers_zussen: [
      { van: 0, tot: 12500, tarief: 20 },
      { van: 12500, tot: 25000, tarief: 25 },
      { van: 25000, tot: 75000, tarief: 35 },
      { van: 75000, tot: 175000, tarief: 50 },
      { van: 175000, tot: null, tarief: 65 },
    ],
    ooms_nichten: [
      { van: 0, tot: 12500, tarief: 25 },
      { van: 12500, tot: 25000, tarief: 30 },
      { van: 25000, tot: 75000, tarief: 40 },
      { van: 75000, tot: 175000, tarief: 55 },
      { van: 175000, tot: null, tarief: 70 },
    ],
    anderen: [
      { van: 0, tot: 12500, tarief: 30 },
      { van: 12500, tot: 25000, tarief: 35 },
      { van: 25000, tot: 75000, tarief: 60 },
      { van: 75000, tot: null, tarief: 80 },
    ],
  },
};

// ── Regionale notes + verdachte periode (zoals in de tool) ──────
export interface GewestNotes {
  notes: Record<Relatie, string>;
  verdachtePeriode: string;
}

export const gewestNotes: Record<Gewest, GewestNotes> = {
  Vlaanderen: {
    notes: {
      rechte_lijn_partner:
        "Hervorming 2026: vereenvoudigd barema met 3 schijven (3/9/27 %). Vrijstelling voor de langstlevende partner op roerende goederen: 75.000 € (vanaf januari 2026). De gezinswoning is volledig vrijgesteld voor de langstlevende partner.",
      broers_zussen: "Verdachte periode: 5 jaar sinds januari 2025.",
      ooms_nichten:
        "Eigen barema in Vlaanderen (25/45/55 %). De berekening gebeurt op het totale aandeel van de groep en niet per erfgenaam afzonderlijk.",
      anderen:
        "De berekening gebeurt op het totale aandeel van de groep. Verdachte periode: 5 jaar.",
    },
    verdachtePeriode: "5 jaar (sinds januari 2025)",
  },
  Brussel: {
    notes: {
      rechte_lijn_partner:
        "Een geregistreerde schenking wordt nooit meer geherintegreerd in de nalatenschap, ook niet bij overlijden binnen de 5 jaar (van kracht sinds januari 2026). De gezinswoning is vrijgesteld voor de partner na 5 jaar wettelijke samenwoning.",
      broers_zussen: "Geen specifieke vrijstelling voor deze categorie.",
      ooms_nichten:
        "De berekening gebeurt op het totale gegroepeerde aandeel van de groep en niet per erfgenaam afzonderlijk.",
      anderen:
        "De berekening gebeurt op het totale aandeel van de groep. Tarieven tot 80 %.",
    },
    verdachtePeriode:
      "5 jaar voor niet-geregistreerde schenkingen (vanaf januari 2026). Geregistreerde schenking: geen herintegratie.",
  },
  Wallonië: {
    notes: {
      rechte_lijn_partner:
        "De gezinswoning is volledig vrijgesteld voor de langstlevende partner. Hervorming gepland voor 2028: maximumtarief van 15 % in rechte lijn.",
      broers_zussen: "5 progressieve schijven van 20 % tot 65 %.",
      ooms_nichten:
        "Tussenliggend tarief tussen broers/zussen en andere personen (25 % tot 70 %). De berekening gebeurt per erfgenaam afzonderlijk in Wallonië.",
      anderen: "Tarieven tot 80 %, de hoogste in België.",
    },
    verdachtePeriode: "5 jaar",
  },
};

// ════════════════════════════════════════════════════════════════
// BEREKENINGEN
// ════════════════════════════════════════════════════════════════

export interface SchijfDetail {
  van: number;
  tot: number;
  tarief: number;
  bedrag: number;
}

/** Progressieve berekening op [0 .. grondslag] met detail per schijf. */
export function berekenMetDetail(
  grondslag: number,
  schijven: Schijf[]
): { totaal: number; detail: SchijfDetail[] } {
  let totaal = 0;
  const detail: SchijfDetail[] = [];
  for (const s of schijven) {
    if (grondslag <= s.van) break;
    const bovengrens = Math.min(grondslag, s.tot ?? Infinity);
    const basis = bovengrens - s.van;
    const bedrag = (basis * s.tarief) / 100;
    detail.push({ van: s.van, tot: bovengrens, tarief: s.tarief, bedrag });
    totaal += bedrag;
  }
  return { totaal: Math.round(totaal * 100) / 100, detail };
}

/** Eenvoudige progressieve totaalberekening (backward compatible). */
export function berekenBelasting(bedrag: number, schijven: Schijf[]): number {
  return berekenMetDetail(bedrag, schijven).totaal;
}

export interface BelastingResultaat {
  totaal: number;
  detail: SchijfDetail[];
  effectiefTarief: number;
  marginaal: boolean;
}

/** Schenkbelasting voor een goed (roerend = vast tarief, onroerend = progressief). */
export function berekenSchenking(
  gewest: Gewest,
  goedType: GoedeType,
  relatie: Relatie,
  waarde: number
): BelastingResultaat {
  if (waarde <= 0) return { totaal: 0, detail: [], effectiefTarief: 0, marginaal: false };

  if (goedType === "roerend") {
    const tarief = SCHENK_ROEREND[gewest][relatie];
    const totaal = Math.round(((waarde * tarief) / 100) * 100) / 100;
    return {
      totaal,
      detail: [{ van: 0, tot: waarde, tarief, bedrag: totaal }],
      effectiefTarief: tarief,
      marginaal: false,
    };
  }

  const { totaal, detail } = berekenMetDetail(waarde, schenkOnroerendSchijven(relatie));
  return { totaal, detail, effectiefTarief: (totaal / waarde) * 100, marginaal: false };
}

/**
 * Erfbelasting op één goed.
 * Met `andereGoederen > 0` wordt het goed marginaal belast: het bevindt zich
 * bovenop reeds aanwezige goederen van dezelfde categorie in de nalatenschap.
 */
export function berekenErfenis(
  gewest: Gewest,
  relatie: Relatie,
  waarde: number,
  andereGoederen = 0
): BelastingResultaat {
  if (waarde <= 0) return { totaal: 0, detail: [], effectiefTarief: 0, marginaal: false };

  const schijven = ERFBELASTING[gewest][relatie];

  // Geen marginale berekening: gewone progressieve berekening op [0 .. waarde].
  if (andereGoederen <= 0) {
    const { totaal, detail } = berekenMetDetail(waarde, schijven);
    return { totaal, detail, effectiefTarief: (totaal / waarde) * 100, marginaal: false };
  }

  // Marginale berekening: rechten(base + waarde) − rechten(base).
  const base = andereGoederen;
  const totaalMet = berekenMetDetail(base + waarde, schijven).totaal;
  const totaalBase = berekenMetDetail(base, schijven).totaal;
  const totaal = Math.round((totaalMet - totaalBase) * 100) / 100;

  // Detail enkel voor het gedeelte boven `base`, weergegeven relatief tot het goed.
  const detail: SchijfDetail[] = [];
  let vorige = base;
  for (const s of schijven) {
    if (base + waarde <= vorige) break;
    const start = Math.max(vorige, base);
    const eind = s.tot === null ? base + waarde : Math.min(base + waarde, s.tot);
    if (eind > start) {
      detail.push({
        van: start - base,
        tot: eind - base,
        tarief: s.tarief,
        bedrag: ((eind - start) * s.tarief) / 100,
      });
    }
    vorige = s.tot === null ? base + waarde : s.tot;
  }

  return { totaal, detail, effectiefTarief: (totaal / waarde) * 100, marginaal: true };
}

// ── Cross-module verwijzingen naar de Vlaamse Codex Fiscaliteit ──
export function getWetRefs(
  gewest: Gewest,
  type: "schenking" | "erfenis",
  goedType: GoedeType,
  relatie: Relatie
): WetRef[] {
  if (gewest === "Vlaanderen") {
    if (type === "schenking") {
      return goedType === "roerend"
        ? [{ wetId: "vlaamse-codex-belastingen", artikelId: "vcf-2-8-4-1-1", label: "VCF art. 2.8.4.1.1 — Roerend 3%/7%" }]
        : [{ wetId: "vlaamse-codex-belastingen", artikelId: "vcf-2-8-4-1-2", label: "VCF art. 2.8.4.1.2 — Onroerend progressief" }];
    }
    const refs: WetRef[] = [
      { wetId: "vlaamse-codex-belastingen", artikelId: "vcf-2-7-1-0-1", label: "VCF art. 2.7.1.0.1 — Tarief erfbelasting" },
    ];
    if (relatie === "rechte_lijn_partner") {
      refs.push({ wetId: "vlaamse-codex-belastingen", artikelId: "vcf-2-8-1-0-1", label: "VCF art. 2.8.1.0.1 — Vrijstelling gezinswoning" });
    }
    return refs;
  }

  if (gewest === "Brussel") {
    if (type === "schenking") {
      return [{ wetId: "code-droits-succession-bxl", artikelId: "cds-bxl-art-5", label: "CDS-BXL — Registratierechten Brussel" }];
    }
    const refs: WetRef[] = [
      { wetId: "code-droits-succession-bxl", artikelId: "cds-bxl-art-1", label: "CDS-BXL — Erfbelasting rechte lijn" },
    ];
    if (relatie === "rechte_lijn_partner") {
      refs.push({ wetId: "code-droits-succession-bxl", artikelId: "cds-bxl-art-3", label: "CDS-BXL — Vrijstelling gezinswoning (250k€)" });
    }
    return refs;
  }

  if (gewest === "Wallonië") {
    if (type === "schenking") {
      return [{ wetId: "cwf-erfbelasting", artikelId: "cwf-art-d-xi-2", label: "CWF art. D.XI.2 — Schenkingsrechten Wallonië" }];
    }
    const refs: WetRef[] = [
      { wetId: "cwf-erfbelasting", artikelId: "cwf-art-d-xii-1", label: "CWF art. D.XII.1 — Erfbelasting Wallonië" },
    ];
    if (relatie === "rechte_lijn_partner") {
      refs.push({ wetId: "cwf-erfbelasting", artikelId: "cwf-art-d-xii-5", label: "CWF art. D.XII.5 — Vrijstelling gezinswoning (160k€)" });
    }
    return refs;
  }

  return [];
}
