"""
DSFA checks — Art. 35 DSGVO (Datenschutz-Folgenabschaetzung).

Level 1: Pflichtangabe erwaehnt?
Level 2: Pflichtangabe korrekt/vollstaendig?
"""

DSFA_CHECKLIST = [
    # ── L1: Schwellwertanalyse ────────────────────────────────────────
    {
        "id": "trigger",
        "label": "Schwellwertanalyse / Ausloesepruefung (Art. 35(1))",
        "level": 1, "parent": None,
        "patterns": [
            r"art\.\s*35\s*(?:abs|absatz)?\s*\.?\s*1",
            r"hohes\s+risiko",
            r"voraussichtlich.*risiko",
            r"schwellwert",
            r"folgen.*(?:verarbeitung|schutz).*personenbezogen",
        ],
        "severity": "HIGH",
        "hint": "Pruefen Sie die DSK-Blacklist (Positivliste der Aufsichtsbehoerden) und die EDSA-Leitlinien WP 248 Rev.01: Treffen 2+ Kriterien zu (z.B. Profiling, systematische Ueberwachung, grosse Datenmenge), ist die DSFA nach Art. 35(1) DSGVO Pflicht.",
    },

    # ── L1: Beschreibung der Verarbeitungsvorgaenge ───────────────────
    {
        "id": "description",
        "label": "Beschreibung der Verarbeitungsvorgaenge (Art. 35(7)(a))",
        "level": 1, "parent": None,
        "patterns": [
            r"beschreibung.*verarbeitung", r"verarbeitungsvorg(?:ae|ä)ng",
            r"systematische\s+beschreibung", r"gegenstand.*verarbeitung",
            r"social\s*media.*(?:angebot|nutzung|besteht\s+aus)",
            r"(?:kan(?:ae|ä)le|plattform).*(?:facebook|twitter|instagram|youtube|linkedin|xing)",
        ],
        "severity": "HIGH",
        "hint": "Art. 35(7)(a) DSGVO verlangt eine 'systematische Beschreibung'. Nutzen Sie die Struktur der EDSA-Leitlinien: Art der Verarbeitung, Umfang (Datenkategorien, Betroffenenanzahl), Kontext (Umstaende), Zweck und Rechtsgrundlage. Ein Datenflussdiagramm wird von LfDI-Behoerden empfohlen.",
    },
    {
        "id": "processing_named",
        "label": "Konkreter Verarbeitungsvorgang benannt",
        "level": 2, "parent": "description",
        "patterns": [
            r"(?:betrieb|nutzung|verwaltung|pflege)\s+(?:der|von|unserer|eines)\s+(?:seite|profil|kan(?:ae|ä)l|account|fanpage|pr(?:ae|ä)senz)",
            r"(?:verarbeitung|erhebung|speicherung)\s+(?:von|der)\s+(?:nutzerdaten|personenbezogen|besucher|mitglieder)",
            r"(?:angebot|social[\-\s]?media[\-\s]?angebot).*(?:besteht\s+aus|umfasst|beinhaltet)",
            r"kan(?:ae|ä)le\w*\s+(?:facebook|twitter|instagram|youtube|linkedin|xing)",
        ],
        "severity": "LOW",
        "hint": "Benennen Sie den Verarbeitungsvorgang konkret, z.B. 'Betrieb einer Facebook-Fanpage inkl. Page Insights' oder 'Videobeobachtung oeffentlicher Bereiche'. Abstrakte Beschreibungen wie 'Nutzung von Social Media' genuegen nicht den Anforderungen der DSK.",
    },

    # ── L1: Notwendigkeit / Verhaeltnismaessigkeit ────────────────────
    {
        "id": "necessity",
        "label": "Notwendigkeit und Verhaeltnismaessigkeit (Art. 35(7)(b))",
        "level": 1, "parent": None,
        "patterns": [
            r"notwendigkeit", r"verh(?:ae|ä)ltnism(?:ae|ä)(?:ss|ß)igkeit",
            r"erforderlichkeit", r"zweckbindung",
            r"geringen?\s+umfang",
            r"nur\s+(?:die|sehr).*daten.*(?:verarbeitet|erhoben)",
            r"freiwillig\s+angegeben",
        ],
        "severity": "HIGH",
        "hint": "Art. 35(7)(b) DSGVO: Pruefen Sie Erforderlichkeit (gibt es mildere Mittel?), Zweckbindung (Art. 5(1)(b)) und Datenminimierung (Art. 5(1)(c)). Bei Social-Media-DSFA: Begruenden Sie, warum eine Fanpage noetig ist und nicht z.B. eine eigene Website genuegt.",
    },
    {
        "id": "legal_basis_dsfa",
        "label": "Rechtsgrundlage fuer die Verarbeitung",
        "level": 2, "parent": "necessity",
        "patterns": [
            r"rechtsgrundlage.*(?:art\.\s*6|berechtigte|einwilligung)",
            r"art\.\s*6\s*(?:abs\.\s*)?1\s*(?:lit\.\s*)?[a-f]",
            r"(?:einwilligung|vertrag|berechtigt).*(?:rechtsgrundlage|grundlage)",
        ],
        "severity": "LOW",
        "hint": "Die Rechtsgrundlage ist Teil der Verhaeltnismaessigkeitspruefung. Bei Art. 6(1) lit. f (berechtigtes Interesse) muss die Interessenabwaegung dokumentiert werden. Bei Art. 9-Daten (z.B. Gesundheit, politische Meinungen) ist zusaetzlich Art. 9(2) DSGVO zu pruefen.",
    },

    # ── L1: Risikobewertung ───────────────────────────────────────────
    {
        "id": "risks",
        "label": "Risikobewertung fuer Betroffene (Art. 35(7)(c))",
        "level": 1, "parent": None,
        "patterns": [
            r"risiko.*(?:bewertung|analyse|einsch(?:ae|ä)tzung|abw(?:ae|ä)gung)",
            r"risiken.*(?:rechte|freiheit)",
            r"eintrittswahrscheinlichkeit",
            r"schwere.*(?:risiko|auswirkung)",
            r"hohes\s+risiko.*(?:rechte|freiheit)",
            r"systematische\s+beobachtung",
        ],
        "severity": "HIGH",
        "hint": "Art. 35(7)(c) DSGVO: Verwenden Sie eine Risikomatrix (Eintrittswahrscheinlichkeit x Schadenshoehe). Die DSK empfiehlt das SDM (Standard-Datenschutzmodell) mit den Schutzzielen: Vertraulichkeit, Integritaet, Verfuegbarkeit, Nichtverkettbarkeit, Transparenz, Intervenierbarkeit.",
    },
    {
        "id": "risk_probability",
        "label": "Eintrittswahrscheinlichkeit bewertet",
        "level": 2, "parent": "risks",
        "patterns": [
            r"eintrittswahrscheinlichkeit",
            r"(?:wahrscheinlichkeit|likelihood)\s*[:\|]",
            r"(?:gering|mittel|hoch)\w*\s+(?:wahrscheinlichkeit|eintritt)",
        ],
        "severity": "MEDIUM",
        "hint": "Nutzen Sie eine 4-stufige Skala (gering/mittel/hoch/sehr hoch) analog zum CNIL-DSFA-Tool oder dem BSI-IT-Grundschutz. Die Eintrittswahrscheinlichkeit muss je Risiko einzeln bewertet und nachvollziehbar begruendet werden.",
    },
    {
        "id": "risk_severity",
        "label": "Schwere/Auswirkung bewertet",
        "level": 2, "parent": "risks",
        "patterns": [
            r"(?:schwere|auswirkung|schadensh(?:oe|ö)he|schadenpotential|schadenpotenzial)\s*[:\|]",
            r"(?:gering|mittel|hoch|kritisch)\w*\s+(?:schwere|auswirkung|schaden)",
            r"(?:physisch|materiell|immateriell)\w*\s+(?:schaden|nachteil|beeintr(?:ae|ä)chtigung)",
            r"schadensschwere",
            r"(?:risiko|gefahr).*(?:gering|mittel|hoch|wesentlich|begrenzt)",
        ],
        "severity": "MEDIUM",
        "hint": "EG 75 DSGVO nennt konkrete Schadensbeispiele: Diskriminierung, Identitaetsdiebstahl, finanzielle Verluste, Rufschaedigung, Verlust der Vertraulichkeit bei Berufsgeheimnissen. Bewerten Sie physische, materielle UND immaterielle Schaeden getrennt.",
    },

    # ── L1: Abhilfemassnahmen ─────────────────────────────────────────
    {
        "id": "measures",
        "label": "Abhilfemassnahmen (Art. 35(7)(d))",
        "level": 1, "parent": None,
        "patterns": [
            r"abhilfe", r"(?:ma(?:ss|ß)nahm).*(?:risiko|schutz|minderung)",
            r"schutzma(?:ss|ß)nahm",
            r"(?:technisch|organisatorisch).*ma(?:ss|ß)nahm",
            r"tom",
            r"risiko.*(?:minim|reduz|begrenzen)",
        ],
        "severity": "HIGH",
        "hint": "Art. 35(7)(d) DSGVO: Ordnen Sie jedem identifizierten Risiko konkrete Abhilfemassnahmen zu. Orientieren Sie sich am SDM (Standard-Datenschutzmodell) der DSK. Das Restrisiko nach Umsetzung der Massnahmen muss explizit bewertet werden.",
    },
    {
        "id": "tom_encryption",
        "label": "Verschluesselung als Massnahme",
        "level": 2, "parent": "measures",
        "patterns": [
            r"verschl(?:ue|ü)sselung|encryption|ssl|tls|https",
            r"(?:transport|ende[\-\s]zu[\-\s]ende)[\-\s]?verschl(?:ue|ü)sselung",
        ],
        "severity": "LOW",
        "hint": "Art. 32(1)(a) DSGVO nennt Verschluesselung ausdruecklich als Massnahme. Dokumentieren Sie konkret: TLS 1.2+ fuer Transport, AES-256 fuer Speicherung, ggf. E2E-Verschluesselung. Bei Social Media: Weisen Sie auf HTTPS-Erzwingung der Plattform hin.",
    },
    {
        "id": "tom_pseudonymization",
        "label": "Pseudonymisierung als Massnahme",
        "level": 2, "parent": "measures",
        "patterns": [
            r"pseudonymisierung|anonymisierung",
            r"(?:pseudonymisiert|anonymisiert).*(?:daten|verarbeit)",
        ],
        "severity": "LOW",
        "hint": "Art. 25(1) DSGVO (Privacy by Design) nennt Pseudonymisierung als Leitbeispiel. Unterscheiden Sie korrekt: Pseudonymisierung (Zuordnung noch moeglich, DSGVO gilt) vs. Anonymisierung (kein Personenbezug mehr, DSGVO gilt nicht). Bei Insights: Aggregation genuegt oft als Anonymisierung.",
    },
    {
        "id": "tom_access_control",
        "label": "Zugriffskontrolle als Massnahme",
        "level": 2, "parent": "measures",
        "patterns": [
            r"zugriffskontrolle|zugangskontrolle|zutrittskontrolle",
            r"(?:berechtigungs|rollen).*(?:konzept|management|vergabe)",
            r"(?:need[\-\s]to[\-\s]know|least\s+privilege|minimalprinzip)",
        ],
        "severity": "LOW",
        "hint": "Dokumentieren Sie ein Berechtigungskonzept nach dem Need-to-know-Prinzip (Art. 32(1)(b) DSGVO). Bei Social Media: Wer hat Admin-Zugriff auf die Fanpage? Wie oft werden Zugriffsrechte geprueft? Mehrstufige Rollenkonzepte (Admin, Editor, Analyst) empfohlen.",
    },
    {
        "id": "tom_logging",
        "label": "Protokollierung/Logging als Massnahme",
        "level": 2, "parent": "measures",
        "patterns": [
            r"(?:protokollierung|logging|audit[\-\s]?trail|nachvollziehbarkeit)",
            r"(?:zugriff|(?:ae|ä)nderung).*(?:protokoll|logging|nachvollzieh)",
        ],
        "severity": "LOW",
        "hint": "Protokollierung dient der Nachweispflicht nach Art. 5(2) DSGVO (Accountability). Dokumentieren Sie: Was wird geloggt (Zugriffe, Aenderungen, Loeschungen), wie lange werden Logs aufbewahrt, wer hat Zugriff auf die Logs. Achtung: Logs selbst sind personenbezogene Daten.",
    },

    # ── L1: Landesbehoerden ───────────────────────────────────────────
    {
        "id": "lfdi",
        "label": "Beruecksichtigung Landesbehoerden-Richtlinie",
        "level": 1, "parent": None,
        "patterns": [
            r"l(?:an)?fdi", r"landesbeauftragt.*datenschutz",
            r"landes.?datenschutz",
            r"richtlinie.*(?:land|lfdi|landes)",
            r"(?:aufsichtsbeh(?:oe|ö)rde|beh(?:oe|ö)rde).*(?:richtlinie|empfehlung|vorgabe)",
            # P39: DSK Liste/Blacklist + spezifische Landesbehoerden
            r"(?:dsk|datenschutzkonferenz)\s+(?:positiv|black)?liste",
            r"art\.?\s*35\s*\(?\s*4\s*\)?\s*dsgvo",
            r"(?:berliner|hamburgische|saechsisch|bayerisch|nordrhein|baden)\w*\s+beauftragt",
            r"(?:bfdi|bvfd|ldsbw|ldsh)",
        ],
        "severity": "MEDIUM",
        "hint": "Die DSK hat eine Positivliste (Blacklist) nach Art. 35(4) DSGVO veroeffentlicht, die DSFA-pflichtige Verarbeitungen auflistet. Zusaetzlich hat jedes Bundesland eigene LfDI-Empfehlungen — z.B. der LfDI BaWue zu Social-Media-Fanpages. Pruefen und zitieren Sie die fuer Sie zustaendige Behoerde.",
    },

    # ── L1: Einbeziehung DSB ──────────────────────────────────────────
    {
        "id": "stakeholders",
        "label": "Einbeziehung des DSB (Art. 35(2))",
        "level": 1, "parent": None,
        "patterns": [
            r"datenschutzbeauftragt.*(?:einbez|konsult|beteilig|rat)",
            r"dsb.*(?:konsult|einbez|rat)",
            r"stellungnahme.*dsb",
            r"(?:rat|empfehlung).*datenschutzbeauftragt",
        ],
        "severity": "MEDIUM",
        "hint": "Art. 35(2) DSGVO: 'Der Verantwortliche holt bei der Durchfuehrung einer DSFA den Rat des DSB ein.' Die Nichtbeteiligung des DSB ist ein eigener Verstoss (Art. 83(4)(a) DSGVO). Dokumentieren Sie Datum, Form und Ergebnis der Konsultation.",
    },
    {
        "id": "dsb_opinion_documented",
        "label": "DSB-Stellungnahme dokumentiert",
        "level": 2, "parent": "stakeholders",
        "patterns": [
            r"stellungnahme.*(?:dsb|datenschutzbeauftragt)",
            r"(?:dsb|datenschutzbeauftragt).*(?:stellungnahme|empfiehlt|bewertet|best(?:ae|ä)tigt)",
            r"(?:empfehlung|beurteilung|einsch(?:ae|ä)tzung)\s+(?:des|der)\s+(?:dsb|datenschutzbeauftragt)",
        ],
        "severity": "LOW",
        "hint": "Die DSB-Stellungnahme sollte enthalten: Bewertung der Risiken, Empfehlung zu Massnahmen, Einschaetzung ob Restrisiko akzeptabel ist. Falls der DSB Bedenken aeussert und die Verarbeitung dennoch erfolgt, ist dies nach Art. 39(1)(c) DSGVO besonders zu dokumentieren.",
    },

    # ── L1: Dokumentation ─────────────────────────────────────────────
    {
        "id": "documentation",
        "label": "Dokumentation der Ergebnisse",
        "level": 1, "parent": None,
        "patterns": [
            r"(?:dokument|ergebnis|bericht).*(?:dsfa|folgenabsch(?:ae|ä)tzung)",
            r"(?:ergebnis|schlussfolgerung|bewertung).*(?:risiko|verarbeitung)",
            r"vorliegend.*(?:dsfa|analyse|bewertung|absch(?:ae|ä)tzung)",
            r"\d\.\)\s*ergebnis",
            r"(?:risiko|gefahr).*(?:gering|mittel|hoch).*(?:einstufen|bewerten|einsch(?:ae|ä)tz)",
            r"(?:gering|mittel|hoch).*(?:einzustufen|zu\s+bewerten)",
        ],
        "severity": "MEDIUM",
        "hint": "Dokumentieren Sie das Ergebnis eindeutig: Ist das Restrisiko nach Umsetzung der Massnahmen tragbar? Falls das Restrisiko 'hoch' bleibt, ist vor Beginn der Verarbeitung die Aufsichtsbehoerde nach Art. 36 DSGVO (vorherige Konsultation) zu befragen.",
    },
    {
        "id": "review_cycle",
        "label": "Ueberpruefungszyklus/Review-Termin",
        "level": 2, "parent": "documentation",
        "patterns": [
            r"(?:ueberpr(?:ue|ü)f|überpr(?:ue|ü)f|review|aktualisierung).*(?:zyklus|turnus|j(?:ae|ä)hrlich|regelm(?:ae|ä)(?:ss|ß)ig|termin)",
            r"(?:regelm(?:ae|ä)(?:ss|ß)ig|j(?:ae|ä)hrlich|quartal|halbjahr).*(?:ueberpr(?:ue|ü)f|überpr(?:ue|ü)f|review|aktualisier)",
            r"n(?:ae|ä)chste\s+(?:ueberpr(?:ue|ü)fung|überprüfung|review)",
        ],
        "severity": "LOW",
        "hint": "Art. 35(11) DSGVO: Die DSFA ist regelmaessig zu ueberpruefen. Best Practice: Jaehrliche Review + anlassbezogen bei wesentlichen Aenderungen (neue Plattform, geaenderte AGB der Plattform, neue Rechtsprechung). Legen Sie einen konkreten naechsten Prueftermin fest.",
    },
]
