"""Heuristic-coverage tests for mc_audit_type.classify_mc_audit_type.

Hand-kuratierte Beispiele aus DSGVO-/AI-Act-/eCall-Kontext, die nahe an
den real-world FAILs aus VW-/BMW-Audits liegen. Wenn ein Pattern hier
fehlschlaegt, fehlt _PROCESS_INTERNAL_PATTERNS bzw. _VERIFIABLE_PATTERNS
eine entsprechende Regel.
"""

import pytest

from compliance.services.mc_audit_type import classify_mc_audit_type


VERIFIABLE_CASES = [
    ("Datenschutzerklaerung nennt Kontaktdaten des Verantwortlichen",
     "Steht im Impressum / DSE der Name + Adresse + Email?"),
    ("Cookie-Banner enthaelt Ablehnen-Button",
     "Ist im Cookie-Banner ein 'Ablehnen' Button sichtbar?"),
    ("Datenschutzerklaerung verweist auf Recht auf Auskunft",
     "Wird in der Datenschutzerklaerung Art. 15 DSGVO erwaehnt?"),
    ("Cookie-Richtlinie listet alle Drittanbieter",
     "Sind alle Vendors in der Cookie-Richtlinie aufgefuehrt?"),
    ("Impressum nennt Telefonnummer",
     "Steht im Impressum eine Kontakttelefonnummer?"),
    ("Datenschutzerklaerung nennt Speicherdauer",
     "Sind in der DSE die Aufbewahrungsfristen angegeben?"),
    ("Cookie-Banner Save-Label entspricht UWG-Vorgabe",
     "Ist der Speichern-Button im Banner korrekt beschriftet?"),
]

PROCESS_INTERNAL_CASES = [
    ("Mitarbeiter-Schulung zu Datenschutz durchgefuehrt",
     "Wurden alle Mitarbeiter zum Thema Datenschutz geschult?"),
    ("AVV mit allen Auftragsverarbeitern abgeschlossen",
     "Liegt fuer jeden Dienst ein Auftragsverarbeitungsvertrag vor?"),
    ("TOM dokumentiert und implementiert",
     "Sind die technisch-organisatorischen Massnahmen umgesetzt?"),
    ("DSFA fuer Hochrisiko-Verarbeitung durchgefuehrt",
     "Wurde eine DSFA durchgefuehrt und dokumentiert?"),
    ("Rollenkonzept eingerichtet",
     "Existiert ein Berechtigungskonzept mit klaren Rollen?"),
    ("Pseudonymisierung von Daten implementiert",
     "Wird Pseudonymisierung aktiv eingesetzt?"),
    ("Backup-Strategie eingerichtet",
     "Sind Backups vorhanden und werden regelmaessig getestet?"),
    ("Abschaltung der Standortdatenverarbeitung kostenfrei ermoeglichen",
     "Kann der Nutzer die Standortdatenverarbeitung kostenfrei abschalten?"),
    ("Ausnahmen bei bereits vorhandenen Informationen dokumentieren",
     "Werden Ausnahmen intern dokumentiert?"),
    ("Sensibilisierung neue Mitarbeiter",
     "Erhalten neue Mitarbeiter eine Awareness-Schulung?"),
    ("72-Stunden-Meldung an Aufsichtsbehoerde eingehalten",
     "Wird die Meldepflicht innerhalb von 72 Stunden umgesetzt?"),
]

DOC_INTERNAL_CASES = [
    ("Verzeichnis von Verarbeitungstaetigkeiten gefuehrt",
     "Existiert ein VVT mit allen Pflichtangaben?"),
    ("Subprozessor-Liste aktualisiert",
     "Wird die Sub-Prozessor-Liste gepflegt?"),
    ("Auftragsverarbeitungsverzeichnis vollstaendig",
     "Sind alle AVVs im Auftragsverarbeitungsverzeichnis erfasst?"),
    ("Aufbewahrungskonzept dokumentiert",
     "Existiert ein dokumentiertes Aufbewahrungskonzept?"),
]


@pytest.mark.parametrize("title,question", VERIFIABLE_CASES)
def test_verifiable_cases(title: str, question: str) -> None:
    """These MCs MUST be classified as verifiable — they describe things
    visible from the outside (website / banner / DSE)."""
    result = classify_mc_audit_type(title, question)
    assert result == "verifiable", (
        f"Expected 'verifiable' for {title!r}, got {result!r}"
    )


@pytest.mark.parametrize("title,question", PROCESS_INTERNAL_CASES)
def test_process_internal_cases(title: str, question: str) -> None:
    """These MCs MUST be classified as process_internal — they describe
    internal customer processes that we cannot verify from the outside."""
    result = classify_mc_audit_type(title, question)
    assert result == "process_internal", (
        f"Expected 'process_internal' for {title!r}, got {result!r}"
    )


@pytest.mark.parametrize("title,question", DOC_INTERNAL_CASES)
def test_doc_internal_cases(title: str, question: str) -> None:
    """These MCs MUST be classified as doc_internal — they describe
    internal documentation (VVT, AVV-Verzeichnis) we cannot inspect."""
    result = classify_mc_audit_type(title, question)
    assert result == "doc_internal", (
        f"Expected 'doc_internal' for {title!r}, got {result!r}"
    )


def test_empty_input_is_ambiguous() -> None:
    assert classify_mc_audit_type("", "") == "ambiguous"
    assert classify_mc_audit_type(None, None) == "ambiguous"
