// Sehr einfacher Parser für die vorhandenen Rechtstexte (AGB, Datenschutz):
// eine Zeile "## N. Titel" beginnt einen neuen, nummerierten Abschnitt,
// Leerzeilen trennen Absätze innerhalb eines Abschnitts. Zeilenbasiert (nicht
// blockbasiert) und toleriert daher auch eine Überschrift ohne Leerzeile
// direkt vor dem ersten Absatz — die Texte werden von Hand im Admin-Bereich
// gepflegt (LegalTextSettingsPanel), eine vergessene Leerzeile soll die Seite
// nicht kaputt machen (vorher landete die Überschrift dann unerkannt als
// Fließtext mitten im vorherigen Abschnitt).
export type LegalSection = {
  id: string;
  number: string;
  title: string;
  paragraphs: string[];
};

const HEADING_RE = /^##\s*(\d+)\.\s*(.+)$/;

export function parseLegalSections(text: string): LegalSection[] {
  const lines = text.split("\n");
  const sections: LegalSection[] = [];
  let currentParagraphLines: string[] = [];

  function flushParagraph() {
    const paragraph = currentParagraphLines.join("\n").trim();
    currentParagraphLines = [];
    if (paragraph && sections.length > 0) sections[sections.length - 1].paragraphs.push(paragraph);
  }

  for (const line of lines) {
    const headingMatch = line.match(HEADING_RE);
    if (headingMatch) {
      flushParagraph();
      const [, number, title] = headingMatch;
      // Eigene, vom eingegebenen Text unabhängige ID (laufender Index) — so
      // bleiben Sprungmarken/TOC auch bei einer doppelt vergebenen oder
      // getippten Nummer eindeutig, statt zwei Abschnitte auf dieselbe
      // Anker-ID kollidieren zu lassen.
      sections.push({ id: `sec-${sections.length + 1}`, number, title: title.trim(), paragraphs: [] });
      continue;
    }
    if (line.trim() === "") {
      flushParagraph();
    } else {
      currentParagraphLines.push(line);
    }
  }
  flushParagraph();

  // Text vor der ersten Überschrift hat keinen Abschnitt zum Andocken und
  // wird oben verworfen (kein currentParagraph-Ziel) — kommt bei den
  // gepflegten Texten nicht vor.
  return sections;
}
