import { verwijderOpmaakMarkers } from "./samenstellen";

// ── Voorbeeld-segmenten: ontwerptekst vs. hypothese ──────────────────────────
// Splitst een ingevuld voorbeeld (onderdeel of volledig model) in gekleurde
// segmenten voor de UI-weergave: de vaste ONTWERPTEKST (zwart) en de
// HYPOTHESES/varianten (rood). Zo ziet de notaris in één oogopslag wat de
// eigenlijke akte-/documenttekst is en wat de te kiezen hypotheses zijn.
//
// De generatie (samenstellen.ts) markeert hypotheses altijd expliciet in de
// tekst: de keuze-instructie "[KIES DE TOEPASSELIJKE HYPOTHESE …]" en elke
// variant met "▸ HYPOTHESE — …:". Een nieuwe clausulekop ("## ") of sectie
// ("=== ") zet de weergave terug op ontwerptekst.
//
// De segmentatie werkt PER REGEL (niet per alinea): een authentieke akte wordt
// door `normaliseerWitruimte` op enkele regeleindes gezet (geen lege regels
// tussen de alinea's), zodat een alinea-splitsing daar één groot blok zou
// opleveren. Regel-per-regel werkt voor zowel de authentieke akte (enkele \n)
// als het onderhandse document (dubbele \n). De functie verzint niets en
// behoudt de tekst exact (op het weghalen van de onzichtbare opmaak-markers na).

export type VoorbeeldSegmentSoort = "ontwerp" | "hypothese";

/** Eén aaneengesloten stuk voorbeeldtekst van één soort (ontwerp of hypothese). */
export interface VoorbeeldSegment {
  soort: VoorbeeldSegmentSoort;
  tekst: string;
}

/** Een regel die een hypothese inleidt (keuze-instructie of een variantlabel), NL én FR. */
const HYPOTHESE_START = /^(?:▸\s*HYPOTH|\[(?:KIES DE TOEPASSELIJKE HYPOTHESE|CHOISIR L'HYPOTH))/i;
/** Een regel die terugkeert naar de ontwerptekst: een clausulekop of een sectiebanner. */
const ONTWERP_HERSTEL = /^(?:#{2,4}\s|===\s)/;

/**
 * Segmenteert een voorbeeldtekst in ontwerp- en hypothese-stukken, per regel.
 * Een regel die een hypothese inleidt zet de weergave op "hypothese" (rood) tot
 * een clausulekop of sectie ze terugzet op "ontwerp" (zwart); lege en gewone
 * regels erven de lopende soort. Opeenvolgende regels van dezelfde soort worden
 * samengevoegd, met de oorspronkelijke regeleindes behouden. Puur.
 */
export function segmenteerVoorbeeld(tekst: string): VoorbeeldSegment[] {
  const segmenten: VoorbeeldSegment[] = [];
  let soort: VoorbeeldSegmentSoort = "ontwerp";

  for (const regel of verwijderOpmaakMarkers(tekst).split("\n")) {
    const kop = regel.trimStart();
    if (HYPOTHESE_START.test(kop)) soort = "hypothese";
    else if (ONTWERP_HERSTEL.test(kop)) soort = "ontwerp";

    const laatste = segmenten[segmenten.length - 1];
    if (laatste && laatste.soort === soort) laatste.tekst += `\n${regel}`;
    else segmenten.push({ soort, tekst: regel });
  }

  return segmenten.filter((s) => s.tekst.trim() !== "");
}
