"""Machine-Check-Definitionen für den DSE-Agent (Layer-0 Regex-Boost).

Eine MC = ein abgegrenztes Art-13/14-DSGVO-Pflichtfeld mit deterministischen
Patterns. Quelle der Patterns ist die EINE kuratierte ART13_CHECKLIST
(doc_checks/dse_checks.py) — hier nur in das MC-Format gehoben, damit der
Regex-Boost (regex_boost.py) und die v3-Engine (v3_engine.py) dieselbe Struktur
nutzen wie impressum/ + cookie_policy/. KEINE Pattern-Duplikation: die Patterns
bleiben in dse_checks.py, dieses Modul kompiliert sie nur.

Owner = dse-agent.
"""

from __future__ import annotations

import re
from dataclasses import dataclass, field
from typing import Pattern

from compliance.services.doc_checks.dse_checks import ART13_CHECKLIST


@dataclass(frozen=True)
class MC:
    """Eine Machine-Check-Definition (Boost-Pattern für ein DSE-Feld)."""
    mc_id: str                      # DSE-MC-001 ...
    field_id: str                   # controller, legal_basis, third_country ...
    label: str
    norm: str
    patterns: tuple[Pattern[str], ...] = field(default_factory=tuple)
    severity_if_missing: str = "MEDIUM"
    level: int = 1


_NORM_RE = re.compile(r"\((Art\.[^)]+|§\s*\d+[^)]*)\)")


def _norm_of(label: str) -> str:
    m = _NORM_RE.search(label or "")
    return m.group(1).strip() if m else "Art. 13/14 DSGVO"


def _compile(patterns: list[str]) -> tuple[Pattern[str], ...]:
    out: list[Pattern[str]] = []
    for p in patterns or ():
        try:
            out.append(re.compile(p, re.IGNORECASE | re.MULTILINE))
        except re.error:
            continue
    return tuple(out)


def _build_mcs() -> tuple[MC, ...]:
    """Hebt die ART13_CHECKLIST in das MC-Format (Boost-Pattern pro Feld)."""
    mcs: list[MC] = []
    for i, c in enumerate(ART13_CHECKLIST, start=1):
        mcs.append(MC(
            mc_id=f"DSE-MC-{i:03d}",
            field_id=c["id"],
            label=c["label"],
            norm=_norm_of(c["label"]),
            patterns=_compile(c.get("patterns", [])),
            severity_if_missing=c.get("severity", "MEDIUM"),
            level=c.get("level", 1),
        ))
    return tuple(mcs)


MCS: tuple[MC, ...] = _build_mcs()

# Public list of all MC-IDs for the Registry / owned_mc_ids.
MC_IDS: tuple[str, ...] = tuple(m.mc_id for m in MCS)


def scope_matches(mc: MC, scope: set[str]) -> bool:
    """Art-13/14-Pflichten gelten universell für jede DSE — keine Branchen-
    Gating auf Boost-Ebene (anders als Impressum mit Kammerberufen). Das
    Sektor-Gate über den control_id-Prefix passiert in der v3-Engine."""
    return True
