// ── Juridische woordenlijst — hyperlinks naar notaris.be / notaire.be ────────
// Voor een aantal juridische begrippen in het (heldere-taal-)compromis maken we
// in de Word-uitvoer een hyperlink naar de begripsuitleg in het officiële
// woordenboek van de notarissen:
//   • NL: https://www.notaris.be/woordenboek/<LETTER>/<slug>?locale=nl
//   • FR: https://www.notaire.be/lexique/<LETTER>/<slug>?locale=fr
// De <slug> is het begrip in kleine letters, zonder accenten, met koppeltekens.
// Enkel de EERSTE keer dat een begrip voorkomt wordt een link gemaakt (zie
// markeerWoordenlijst), zodat het document niet vol links komt te staan.

export type Taal = "nl" | "fr";

export interface WoordenlijstTerm {
  /** Het begrip zoals het in de tekst voorkomt (hoofdletterongevoelig gematcht). */
  term: string;
  url: string;
}

const nl = (letter: string, slug: string) => `https://www.notaris.be/woordenboek/${letter}/${slug}?locale=nl`;
const fr = (letter: string, slug: string) => `https://www.notaire.be/lexique/${letter}/${slug}?locale=fr`;

export const WOORDENLIJST_NL: WoordenlijstTerm[] = [
  { term: "erfdienstbaarheid", url: nl("E", "erfdienstbaarheid") },
  { term: "erfdienstbaarheden", url: nl("E", "erfdienstbaarheid") },
  { term: "mandeligheid", url: nl("M", "mandeligheid") },
  { term: "vruchtgebruik", url: nl("V", "vruchtgebruik") },
  { term: "blote eigendom", url: nl("B", "blote-eigendom") },
  { term: "hypotheek", url: nl("H", "hypotheek") },
  { term: "opschortende voorwaarde", url: nl("O", "opschortende-voorwaarde") },
  { term: "kadastraal inkomen", url: nl("K", "kadastraal-inkomen") },
  { term: "mede-eigendom", url: nl("M", "mede-eigendom") },
  { term: "basisakte", url: nl("B", "basisakte") },
  { term: "syndicus", url: nl("S", "syndicus") },
  { term: "bodemattest", url: nl("B", "bodemattest") },
  { term: "voorkooprecht", url: nl("V", "voorkooprecht") },
  { term: "voorkeurrecht", url: nl("V", "voorkeurrecht") },
  { term: "postinterventiedossier", url: nl("P", "postinterventiedossier") },
  { term: "registratierechten", url: nl("R", "registratierechten") },
  { term: "nalatenschap", url: nl("N", "nalatenschap") },
];

export const WOORDENLIJST_FR: WoordenlijstTerm[] = [
  { term: "servitude", url: fr("S", "servitude") },
  { term: "servitudes", url: fr("S", "servitude") },
  { term: "mitoyenneté", url: fr("M", "mitoyennete") },
  { term: "mitoyennetés", url: fr("M", "mitoyennete") },
  { term: "usufruit", url: fr("U", "usufruit") },
  { term: "nue-propriété", url: fr("N", "nue-propriete") },
  { term: "hypothèque", url: fr("H", "hypotheque") },
  { term: "condition suspensive", url: fr("C", "condition-suspensive") },
  { term: "revenu cadastral", url: fr("R", "revenu-cadastral") },
  { term: "copropriété", url: fr("C", "copropriete") },
  { term: "acte de base", url: fr("A", "acte-de-base") },
  { term: "syndic", url: fr("S", "syndic") },
  { term: "droit de préemption", url: fr("D", "droit-de-preemption") },
  { term: "droit de préférence", url: fr("D", "droit-de-preference") },
  { term: "infraction urbanistique", url: fr("I", "infraction-urbanistique") },
  { term: "précompte immobilier", url: fr("P", "precompte-immobilier") },
  { term: "succession", url: fr("S", "succession") },
];

/** URL per begrip (kleine letters) — voor het oplossen bij het renderen. */
export const WOORDENLIJST_URL: Map<string, string> = new Map(
  [...WOORDENLIJST_NL, ...WOORDENLIJST_FR].map((t) => [t.term.toLowerCase(), t.url])
);

// Private-use markers rond een begrip dat een hyperlink wordt (zie lib/word/runs.ts).
const LINK_OPEN = "";
const LINK_SLUIT = "";

function escapeRegex(s: string): string {
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}

/**
 * Markeert in de tekst de EERSTE keer dat een woordenlijst-begrip voorkomt met
 * link-markers, zodat de Word-render er een hyperlink naar het woordenboek van
 * maakt. Structuurregels (koppen, sectiegroepen, hypothese- en commentaarregels)
 * worden overgeslagen. Hoofdletterongevoelig; langere begrippen krijgen voorrang.
 */
export function markeerWoordenlijst(tekst: string, taal: Taal): string {
  const lijst = taal === "fr" ? WOORDENLIJST_FR : WOORDENLIJST_NL;
  if (lijst.length === 0) return tekst;
  const termen = [...lijst].sort((a, b) => b.term.length - a.term.length);
  const re = new RegExp(
    `(?<![\\p{L}\\d-])(${termen.map((t) => escapeRegex(t.term)).join("|")})(?![\\p{L}\\d-])`,
    "giu"
  );
  const gezien = new Set<string>();
  return tekst
    .split("\n")
    .map((regel) => {
      // Geen links in koppen, sectiegroepen, hypothese- of commentaarregels.
      if (/^(#{2,4} |=== |▸ |\[)/.test(regel)) return regel;
      return regel.replace(re, (m) => {
        const sleutel = m.toLowerCase();
        if (gezien.has(sleutel) || !WOORDENLIJST_URL.has(sleutel)) return m;
        gezien.add(sleutel);
        return `${LINK_OPEN}${m}${LINK_SLUIT}`;
      });
    })
    .join("\n");
}
