// ── Centraal register van akteType-namen ─────────────────────────────────────
// Eén bron van waarheid voor de vrije-tekst-`akteType`-conventie die model-,
// detectie- en uitbouwlaag aan elkaar bindt: een model met exact deze string
// wordt door `bepaalAkteType` gevonden en telt mee in de dekkingsmatrix
// (`bepaalUitbouwDekking`). Vóór dit register was elke laag een kale string
// en kwam een typo pas via een falende test (of erger: een stilzwijgend
// ontbrekend model) aan het licht; nu is het een compile-fout in de lagen die
// de union gebruiken (AkteTypeKeuze, UitbouwKandidaat, GoudenPadScenario).
//
// `Modeldocument.akteType` blijft bewust een kale `string`: gebruikersmodellen
// uit IndexedDB/Supabase kunnen elk akteType dragen en een compile-union kan
// runtime-data niet afdwingen. Voor de seed-bibliotheek bewaakt
// `akte-types.test.ts` dat elk seed-model een geregistreerd akteType heeft.
//
// Een nieuw akteType toevoegen = één regel hier + het model/de detectie die
// erbij horen (zie DRAAIBOEK-GOUDEN-PAD.md).

export const AKTETYPES = [
  // ── Vastgoed — bestaande modellen ──
  "verkoopovereenkomst (compromis)",
  "verkoopovereenkomst (compromis) - heldere taal",
  "verkoopakte",
  "verkoopakte - heldere taal",
  "algemeen kader (vastgoedakte)",
  "minnelijke ontbinding verkoopovereenkomst",
  "onherroepbaar aankoopbod",
  // ── Vastgoed — sub-paden (kruisen met verkoopdocument via `verkoopRegime`,
  // geen apart dossiertype — zie ARCHITECTURE.md "Nieuwe gouden (sub-)paden") ──
  "verkoopovereenkomst (compromis) - wet breyne",
  "verkoopakte - wet breyne",
  "verkoopovereenkomst (compromis) - lijfrente",
  "verkoopakte - lijfrente",
  // ── Vastgoed — uitbouwkandidaten ──
  "kredietakte",
  "basisakte",
  "verdeling-uit-onverdeeldheid",
  "openbare-verkoop",
  "ruil",
  "vestiging-erfpacht-opstal",
  "hypothecair-mandaat",
  "handlichting",
  "verkavelingsakte",
  "verklaring van onbeslagbaarheid hoofdverblijfplaats zelfstandige",
  "eenzijdige verzaking aan vruchtgebruik",
  "beeindiging beding van aanwas",
  "verklaring van aanwas na overlijden",
  "akte van neerlegging eigenhandig testament",
  "akte van neerlegging internationaal testament",
  "akte van verwerping van nalatenschap",
  "akte van aanvaarding onder voorrecht van boedelbeschrijving",
  "notarieel testament",
  // ── Familie — bestaande modellen ──
  "schenkingsakte",
  "schenkingsakte-roerend-goed",
  "keuzetestament",
  "testament-gezinswoning-partner-restlegaat-kinderen",
  "zorgvolmacht",
  "verzoekschrift machtiging verkoop uit de hand",
  // ── Familie — uitbouwkandidaten ──
  "erfovereenkomst",
  "aangifte-nalatenschap",
  "huwelijkscontract",
  "wijziging-huwelijksstelsel",
  "samenlevingsovereenkomst",
  "echtscheiding-onderlinge-toestemming",
  "akte-erfopvolging",
  "akte van onroerende erfopvolging",
  // ── Vennootschappen ──
  "aanpassing-statuten-besloten-vennootschap",
  "oprichting-vennootschap",
  "ontbinding-vereffening-vennootschap",
  "omzetting-vennootschap",
  // ── Algemeen ──
  "volmacht",
  "onderhandse volmacht",
] as const;

/**
 * Naam van een gekend akteType. Gebruik deze union overal waar code een
 * akteType TOEKENT of VERWACHT (detectie-uitkomst, uitbouwkandidaat,
 * gouden-pad-scenario); gebruik `string` enkel voor runtime-data van buiten
 * (gebruikersmodellen, MCP-invoer).
 */
export type AkteTypeNaam = (typeof AKTETYPES)[number];

const AKTETYPE_SET: ReadonlySet<string> = new Set(AKTETYPES);

/** Is deze runtime-string een geregistreerd akteType? (type guard). */
export function isGekendAkteType(waarde: string): waarde is AkteTypeNaam {
  return AKTETYPE_SET.has(waarde);
}
