// ── Overdrachtsgrens-lint: agent-1-only-verwijzingen opsporen ────────────────
// Spec: OVERDRACHT-TWEE-AGENTS.md (§Verificatiestrategie, niveau 1). De tekst
// die letterlijk in elk gegenereerd .docx wordt ingebed (WERKDOSSIER_AGENT_PROMPT,
// WERKBLAD_KORTE_PROMPT, KORTE_COPILOT_PROMPT.fr) moet zelfstandig blijven voor
// agent 2 (algemeen, zonder Notary.AI-toegang, zonder sessiegeheugen). Deze
// module is puur lexicaal/deterministisch — geen LLM-aanroep, geschikt voor CI.
//
// Twee denylists:
//  - MCP-toolnamen: agent 2 kan ze niet aanroepen — nooit toegelaten, geen
//    uitzondering.
//  - Contextpatronen: veronderstellen een gedeeld sessiegeheugen/-ID met
//    agent 1 — enkel een schending wanneer de regel ook GEEN toegelaten,
//    gracieus-degraderende formulering bevat (zie TOEGELATEN_FORMULERINGEN).
//
// Nieuwe toolnaam in de MCP-server? Voeg ze hier toe zodat een per ongeluk
// ingebedde verwijzing meteen faalt in plaats van pas bij een productieklacht.

/** MCP-toolnamen die agent 2 (zonder MCP-toegang) nooit kan aanroepen. */
export const VERBODEN_MCP_TOOLNAMEN: readonly string[] = [
  "genereerWerkdossierAlsWord",
  "haalModeldocumentAlsWord",
  "haalModeldocument",
  "lijstModeldocumenten",
  "berekenAktekosten",
  "berekenBelasting",
  "bepaalAkteType",
  "bepaalModelmailCategorieen",
  "bepaalVolgendeStappen",
  "lijstModelbrieven",
  "haalModelbrief",
  "voegModelonderdeelVoorstelToe",
  "voegModeldocumentVoorstelToe",
];

/**
 * Zinsnedes die een gedeeld sessiegeheugen/-ID met agent 1 veronderstellen.
 * Geen van deze patronen komt vandaag legitiem voor in de ingebedde tekst —
 * een toekomstige toevoeging faalt dus meteen, tenzij de regel ook een
 * toegelaten formulering bevat.
 */
export const VERBODEN_CONTEXT_PATRONEN: readonly RegExp[] = [
  /sessie-id/i,
  /dossier-id\b/i,
  /gespreks-id/i,
  /zoals (eerder|hierboven) besproken/i,
  /\b(je|uw) vorige (bericht|beurt|antwoord)\b/i,
  /de agent die dit dossier eerder behandelde/i,
];

/**
 * Optionele-capaciteit-formuleringen die WEL toegelaten zijn (gracieuze
 * degradatie: "indien je toegang hebt tot X, doe dan Y; heb je die niet, dan
 * is dat geen blokkering"). Een contextpatroon-treffer op een regel die ook
 * hier een treffer heeft, is geen schending.
 */
export const TOEGELATEN_FORMULERINGEN: readonly RegExp[] = [
  /indien je .*(toegang|mogelijkheid) hebt/i,
  /heb je (toegang tot|geen) /i,
  /ondersteunt je omgeving (geen|niet)/i,
  /of je .*toegang had/i,
];

export interface OverdrachtsgrensSchending {
  /** De verboden toolnaam of het verboden patroon (bron van de treffer). */
  term: string;
  /** De volledige regel waarin de treffer voorkomt, voor snelle diagnose. */
  regel: string;
}

/**
 * Scant een ingebedde werkbladtekst op verwijzingen die enkel agent 1 (met
 * Notary.AI-MCP-toegang) kan invullen. Geeft een lege lijst voor zelfstandige
 * tekst. Regel per regel, zodat TOEGELATEN_FORMULERINGEN lokaal (per regel)
 * werkt in plaats van over het hele document.
 */
export function vindOverdrachtsgrensSchendingen(tekst: string): OverdrachtsgrensSchending[] {
  const schendingen: OverdrachtsgrensSchending[] = [];
  for (const regel of tekst.split("\n")) {
    for (const naam of VERBODEN_MCP_TOOLNAMEN) {
      if (new RegExp(`\\b${naam}\\b`).test(regel)) {
        schendingen.push({ term: naam, regel: regel.trim() });
      }
    }
    const toegelaten = TOEGELATEN_FORMULERINGEN.some((p) => p.test(regel));
    if (!toegelaten) {
      for (const patroon of VERBODEN_CONTEXT_PATRONEN) {
        if (patroon.test(regel)) {
          schendingen.push({ term: patroon.source, regel: regel.trim() });
        }
      }
    }
  }
  return schendingen;
}
