"""Titel-Hygiene: klammer-bewusster Split + Dash-Normalisierung (M1.1).

Reale aak-Schadensfälle: ein en-Dash mit einseitigem Space INNERHALB eines Titels
wurde zum Separator → Split mitten im Titel („Aε-Algorithmus (Güte 1+ε, Laufzeit O(n3").
"""

from textkit import _norm_dash, _title, _split_top, _unclosed, _parse_selection


def test_norm_dash_top_level_only():
    # einseitiger Space am Dash → Separator (Modelle liefern das so)
    assert _norm_dash("Titel –Beschreibung") == "Titel — Beschreibung"
    assert _norm_dash("Titel— Beschreibung") == "Titel — Beschreibung"
    # Dash INNERHALB offener Klammer bleibt unangetastet (kein Separator)
    assert _norm_dash("f (a – b) — Rest") == "f (a – b) — Rest"
    # ASCII-Hyphen und geklebte/rangebasierte Dashes sind nie Separatoren
    assert _norm_dash("3-SAT") == "3-SAT"
    assert _norm_dash("12–15") == "12–15"


def test_split_top_bracket_aware():
    assert _split_top("a (b — c) — d", " — ") == "a (b — c)"
    assert _split_top("a — b", " — ") == "a"
    assert _split_top("kein Separator hier", " — ") == "kein Separator hier"


def test_unclosed_bracket_detection():
    assert _unclosed("a (b") is True
    assert _unclosed("a [b {c") is True
    assert _unclosed("a (b) c") is False
    assert _unclosed("a) b") is False          # überzähliger Schließer ist kein Abschnitt


def test_title_keeps_bracketed_dash():
    """Der Separator innerhalb der Klammer zerschneidet den Titel nicht mehr."""
    t = _title("Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³)) — der Approx-Algorithmus")
    assert t == "Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³))"


def test_title_plain_split_unchanged():
    assert _title("Vertex Cover — minimale Knotenüberdeckung") == "Vertex Cover"
    assert _title("Ohne Separator bleibt ganz") == "Ohne Separator bleibt ganz"


def test_title_unclosed_bracket_keeps_entry():
    """Malformed: offene Klammer nie geschlossen → keinen abgeschnittenen Titel ausgeben,
    stattdessen den ganzen Eintrag behalten (Repair = Split rückgängig)."""
    e = "N P via Turingmaschine (Definition 6.19 — Rest"
    assert _title(e) == e


def test_parse_selection_then_title_regression():
    """End-to-end der Parse-Kette (wie in der Pipeline): _norm_dash + _title lassen den
    Klammer-Inhalt intakt statt mitten im Titel zu splitten (der reale aak-Bug)."""
    line = "1. Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³)) — der Approximations-Algorithmus"
    entries = _parse_selection(line)
    assert _title(entries[1]) == "Aε-Algorithmus (Güte 1+ε – Laufzeit O(n³))"
