"""
TOM-Anlage (Technische und Organisatorische Massnahmen) checks — Art. 32 DSGVO.

Prueft die 8 klassischen Kontrollziele nach dem DSK-Standard
sowie die Art. 32(1) Anforderungen.

Level 1: Kontrollziel adressiert?
Level 2: Konkrete Massnahme beschrieben?
"""

TOM_ANNEX_CHECKLIST = [
    # ── L1: Zutrittskontrolle ────────────────────────────────────────
    {
        "id": "tom_access_physical",
        "label": "Zutrittskontrolle (physischer Zugang)",
        "level": 1, "parent": None,
        "patterns": [
            r"zutrittskontrolle",
            r"physische[rn]?\s+(?:zugang|sicherheit|zutrittskontrolle)",
            r"geb(?:ae|ä)ude(?:sicherheit|zugang|zutritt)",
        ],
        "severity": "HIGH",
        "hint": "Zutrittskontrolle: Unbefugten den physischen Zugang zu Datenverarbeitungsanlagen verwehren. Beispiele: Schliessanlage, Chipkarte, Videoüberwachung, Besucherregelung.",
    },
    {
        "id": "tom_access_physical_measures",
        "label": "Konkrete Zutrittsmassnahmen benannt",
        "level": 2, "parent": "tom_access_physical",
        "patterns": [
            r"(?:schl(?:ue|ü)ssel|chipkarte|badge|code|pin|biometr|video(?:ue|ü)berwachung|alarm|pfortner|empfang|besucher)",
            r"(?:zutrittskontroll|zugangs)(?:system|anlage|konzept)",
        ],
        "severity": "MEDIUM",
        "hint": "Nicht nur 'Zutrittskontrolle vorhanden' schreiben — konkrete Massnahmen benennen (z.B. 'elektronisches Schliesssystem mit personenbezogenen Chipkarten, protokollierte Besucherregelung').",
    },

    # ── L1: Zugangskontrolle ─────────────────────────────────────────
    {
        "id": "tom_access_logical",
        "label": "Zugangskontrolle (IT-Systeme)",
        "level": 1, "parent": None,
        "patterns": [
            r"zugangskontrolle",
            r"(?:authentifizierung|authentisierung|login|anmeldung)\s+(?:zu|an|fuer|bei)\s+(?:systemen|it-?systemen|anwendungen)",
            r"(?:passwort|kennwort)[\s-]?(?:richtlinie|policy|politik|regelung)",
        ],
        "severity": "HIGH",
        "hint": "Zugangskontrolle: Unbefugten den Zugang zu IT-Systemen verwehren. Beispiele: Passwortrichtlinie, MFA, automatische Sperrung, VPN.",
    },
    {
        "id": "tom_access_logical_mfa",
        "label": "Multi-Faktor-Authentifizierung oder starke Passwoerter",
        "level": 2, "parent": "tom_access_logical",
        "patterns": [
            r"(?:multi[\s-]?faktor|zwei[\s-]?faktor|2[\s-]?fa|mfa|totp|fido|yubikey)",
            r"(?:passwort|kennwort)[\s\S]{0,100}(?:mindestens\s+\d+\s+zeichen|komplex|stark|sicher)",
        ],
        "severity": "MEDIUM",
        "hint": "BSI empfiehlt MFA fuer alle Administratorzugaenge. Mindestens starke Passwoerter (12+ Zeichen, Komplexitaetsanforderungen) muessen dokumentiert sein.",
    },

    # ── L1: Zugriffskontrolle ────────────────────────────────────────
    {
        "id": "tom_authorization",
        "label": "Zugriffskontrolle (Berechtigungen)",
        "level": 1, "parent": None,
        "patterns": [
            r"zugriffskontrolle",
            r"(?:berechtigungs|rechte|rollen)(?:konzept|management|vergabe|system)",
            r"(?:need[\s-]?to[\s-]?know|least\s+privilege|minimalprinzip)",
        ],
        "severity": "HIGH",
        "hint": "Zugriffskontrolle: Sicherstellen, dass Benutzer nur auf die Daten zugreifen koennen, fuer die sie berechtigt sind. Beispiele: Rollenkonzept (RBAC), Need-to-Know-Prinzip, regelmaessige Rechterezertifizierung.",
    },

    # ── L1: Weitergabekontrolle / Uebertragungssicherheit ───────────
    {
        "id": "tom_transfer",
        "label": "Weitergabekontrolle / Verschluesselung bei Transport",
        "level": 1, "parent": None,
        "patterns": [
            r"weitergabekontrolle",
            r"(?:ue|ü)bertragungssicherheit",
            r"(?:transport|uebertragung|transit)[\s-]?verschl(?:ue|ü)sselung",
            r"(?:tls|ssl|https|sftp|vpn|ipsec)\s",
        ],
        "severity": "HIGH",
        "hint": "Weitergabekontrolle: Personenbezogene Daten duerfen bei elektronischer Uebertragung nicht unbefugt gelesen, kopiert oder veraendert werden. Beispiele: TLS 1.2+, VPN, verschluesselter E-Mail-Versand.",
    },
    {
        "id": "tom_transfer_encryption",
        "label": "Verschluesselungsstandard benannt (TLS, AES etc.)",
        "level": 2, "parent": "tom_transfer",
        "patterns": [
            r"(?:tls|ssl)\s*(?:1\.[2-3]|1\.3)",
            r"aes[\s-]?(?:128|256)",
            r"verschl(?:ue|ü)sselung[\s\S]{0,100}(?:bit|aes|rsa|ecc|sha)",
        ],
        "severity": "MEDIUM",
        "hint": "Konkrete Standards benennen: TLS 1.2 oder hoeher (nicht 'SSL'), AES-256 fuer Verschluesselung at Rest. Stand der Technik nach Art. 32(1) DSGVO.",
    },

    # ── L1: Eingabekontrolle ─────────────────────────────────────────
    {
        "id": "tom_input",
        "label": "Eingabekontrolle (Protokollierung)",
        "level": 1, "parent": None,
        "patterns": [
            r"eingabekontrolle",
            r"(?:protokollierung|logging|audit[\s-]?(?:log|trail|protokoll))",
            r"(?:nachvollziehbar|nachvollziehbarkeit)\s+(?:der\s+)?(?:eingabe|aenderung|loeschung|verarbeitung)",
        ],
        "severity": "MEDIUM",
        "hint": "Eingabekontrolle: Nachtraeglich pruefen koennen, wer wann welche Daten eingegeben, geaendert oder geloescht hat. Beispiele: Audit-Logging, Versionierung, Zugriffsprotokollierung.",
    },

    # ── L1: Auftragskontrolle ────────────────────────────────────────
    {
        "id": "tom_processing_control",
        "label": "Auftragskontrolle (Weisungsgebundenheit)",
        "level": 1, "parent": None,
        "patterns": [
            r"auftragskontrolle",
            r"(?:weisung|anweisung)(?:sgebunden|en)\s+(?:der\s+)?(?:mitarbeiter|besch(?:ae|ä)ftigten)",
            r"(?:schulung|sensibilisierung)\s+(?:der\s+)?(?:mitarbeiter|besch(?:ae|ä)ftigten)\s+(?:zum|im|bezueglich)\s+(?:datenschutz|umgang\s+mit\s+daten)",
        ],
        "severity": "MEDIUM",
        "hint": "Auftragskontrolle: Sicherstellen, dass personenbezogene Daten nur entsprechend den Weisungen verarbeitet werden. Beispiele: Mitarbeiterschulungen, Verpflichtung auf Datengeheimnis.",
    },

    # ── L1: Verfuegbarkeitskontrolle ─────────────────────────────────
    {
        "id": "tom_availability",
        "label": "Verfuegbarkeitskontrolle (Backup, Wiederherstellung)",
        "level": 1, "parent": None,
        "patterns": [
            r"verf(?:ue|ü)gbarkeit(?:skontrolle)?",
            r"(?:backup|datensicherung|wiederherstellung|disaster\s+recovery|business\s+continuity)",
            r"(?:redundanz|spiegelung|replikation|georedundant)",
        ],
        "severity": "HIGH",
        "hint": "Verfuegbarkeitskontrolle: Personenbezogene Daten gegen Verlust schuetzen. Beispiele: Regelmaessige Backups, Redundanz, Disaster-Recovery-Plan, USV.",
    },

    # ── L1: Trennungskontrolle ───────────────────────────────────────
    {
        "id": "tom_separation",
        "label": "Trennungskontrolle (Mandantenfaehigkeit)",
        "level": 1, "parent": None,
        "patterns": [
            r"trennungskontrolle",
            r"(?:mandantenf(?:ae|ä)higkeit|mandantentrennung|datentrennung)",
            r"(?:logische|physische)\s+trennung\s+(?:der\s+)?(?:daten|systeme)",
            r"(?:zweckbindung|zwecktrennung)",
        ],
        "severity": "MEDIUM",
        "hint": "Trennungskontrolle: Sicherstellen, dass Daten verschiedener Auftraggeber/Zwecke getrennt verarbeitet werden. Beispiele: Mandantenfaehige Software, getrennte Datenbanken, Berechtigungskonzept.",
    },

    # ── L1: Verschluesselung at Rest ─────────────────────────────────
    {
        "id": "tom_encryption_rest",
        "label": "Verschluesselung gespeicherter Daten (at Rest)",
        "level": 1, "parent": None,
        "patterns": [
            r"verschl(?:ue|ü)sselung[\s\S]{0,50}(?:gespeichert|ruhend|at[\s-]?rest|festplatte|datentraeger|datenbank)",
            r"(?:at[\s-]?rest|ruhende\s+daten|gespeicherte\s+daten)[\s\S]{0,50}verschl(?:ue|ü)ssel",
            r"(?:festplatten|datentraeger|datenbank|disk)[\s-]?verschl(?:ue|ü)sselung",
        ],
        "severity": "HIGH",
        "hint": "Art. 32(1)(a) DSGVO: Verschluesselung ist explizit als Sicherheitsmassnahme benannt. Ohne Verschluesselung at Rest ist der Schutz bei physischem Verlust von Datentraegern nicht gewaehrleistet.",
    },
]
