"""
Sub-Processor List checks — Art. 28(3)(d) DSGVO.

Prueft ob die Sub-Processor-Liste vollstaendig und
konform strukturiert ist.

Level 1: Pflichtangabe vorhanden?
Level 2: Angabe konkret genug?
"""

SUB_PROCESSOR_LIST_CHECKLIST = [
    # ── L1: Tabellen-/Listenstruktur ─────────────────────────────────
    {
        "id": "sub_structure",
        "label": "Strukturierte Liste (Tabelle/Auflistung)",
        "level": 1, "parent": None,
        "patterns": [
            r"(?:unterauftragnehmer|sub[\s-]?processor|unterauftragsverarbeiter)[\s\S]{0,200}(?:name|firma|unternehmen)",
            r"(?:nr|#|\d+)\s*[.)\]]\s+(?:name|firma|unternehmen)\s*[.:]\s*\w",
            r"(?:name|firma)\s+(?:sitz|standort|adresse|land|zweck|leistung)",
        ],
        "severity": "HIGH",
        "hint": "Die Sub-Processor-Liste muss strukturiert sein (Tabelle oder nummerierte Liste), nicht nur als Fliesstext. Jeder Eintrag sollte klar abgegrenzt sein.",
    },

    # ── L1: Name des Sub-Processors ──────────────────────────────────
    {
        "id": "sub_name",
        "label": "Name/Firma jedes Sub-Processors angegeben",
        "level": 1, "parent": None,
        "patterns": [
            r"(?:name|firma|unternehmen)\s*[.:]\s*\w{2,}",
            r"(?:gmbh|ag|inc|llc|ltd|se|sarl|bv|corp)\b",
        ],
        "severity": "CRITICAL",
        "hint": "Jeder Sub-Processor muss namentlich (vollstaendiger Firmenname mit Rechtsform) identifiziert werden. Unbestimmte Angaben wie 'diverse IT-Dienstleister' genuegen nicht.",
    },

    # ── L1: Sitz/Land ────────────────────────────────────────────────
    {
        "id": "sub_location",
        "label": "Sitz/Land jedes Sub-Processors angegeben",
        "level": 1, "parent": None,
        "patterns": [
            r"(?:sitz|standort|land|laender|country)\s*[.:]\s*(?:deutschland|usa|irland|niederlande|frankreich|eu|ewr|germany|ireland|united\s+states|netherlands)",
            r"(?:frankfurt|dublin|amsterdam|paris|london|seattle|virginia|california|oregon)",
            r"(?:de|us|ie|nl|fr|gb|at|ch)\b[\s,]",
        ],
        "severity": "HIGH",
        "hint": "Fuer jeden Sub-Processor muss der Sitz (Land, ggf. Stadt) angegeben werden. Bei Drittlandtransfer (nicht-EU/EWR) muss der Transfermechanismus dokumentiert sein.",
    },
    {
        "id": "sub_location_thirdcountry",
        "label": "Drittlandtransfer identifiziert und Mechanismus benannt",
        "level": 2, "parent": "sub_location",
        "patterns": [
            r"(?:usa|united\s+states|indien|india|china|japan|australi|brasil|canad|israel|south\s+korea|singapur|singapore)",
            r"(?:scc|standardvertragsklausel|data\s+privacy\s+framework|dpf|angemessenheitsbeschluss|adequacy)",
            r"(?:drittland|third\s+country|nicht[\s-]?(?:eu|ewr))",
        ],
        "severity": "HIGH",
        "hint": "Sub-Processor in Drittlaendern (z.B. USA) benoetigen einen gueltige Transfermechanismus: EU-US Data Privacy Framework (DPF), SCC, oder Angemessenheitsbeschluss. Ohne Mechanismus ist der Transfer rechtswidrig.",
    },

    # ── L1: Verarbeitungszweck ───────────────────────────────────────
    {
        "id": "sub_purpose",
        "label": "Verarbeitungszweck pro Sub-Processor beschrieben",
        "level": 1, "parent": None,
        "patterns": [
            r"(?:zweck|leistung|taetigkeit|aufgabe|dienstleistung|beschreibung)\s*[.:]\s*\w{3,}",
            r"(?:hosting|speicherung|support|wartung|monitoring|logging|e[\s-]?mail|crm|analytics|cdn|backup|payment)",
        ],
        "severity": "HIGH",
        "hint": "Fuer jeden Sub-Processor muss der konkrete Verarbeitungszweck angegeben werden (z.B. 'Hosting der Kundendatenbank', 'E-Mail-Versand'). Allgemeine Angaben wie 'IT-Services' genuegen nicht.",
    },

    # ── L1: Datenkategorien ──────────────────────────────────────────
    {
        "id": "sub_data_categories",
        "label": "Verarbeitete Datenkategorien pro Sub-Processor",
        "level": 1, "parent": None,
        "patterns": [
            r"(?:daten(?:kategorie|art)n?|art\s+der\s+(?:personenbezogenen\s+)?daten)\s*[.:]\s*\w",
            r"(?:name|e[\s-]?mail|ip[\s-]?adresse|kundendaten|nutzungsdaten|bestandsdaten|kontaktdaten|zahlungsdaten)",
        ],
        "severity": "MEDIUM",
        "hint": "Best Practice: Pro Sub-Processor angeben welche Datenkategorien verarbeitet werden (z.B. 'E-Mail-Adressen, IP-Adressen'). Erleichtert die Risikoeinschaetzung und die Beantwortung von Betroffenenanfragen.",
    },

    # ── L1: Aktualitaet ─────────────────────────────────────────────
    {
        "id": "sub_date",
        "label": "Datum/Stand der Liste angegeben",
        "level": 1, "parent": None,
        "patterns": [
            r"(?:stand|datum|version|aktualisiert|letzte\s+(?:ae|ä)nderung|g(?:ue|ü)ltig\s+(?:ab|seit))\s*[.:]\s*\d{1,2}[./]\d{1,2}[./]\d{2,4}",
            r"(?:stand|version|vom)\s*[.:]\s*(?:januar|februar|maerz|april|mai|juni|juli|august|september|oktober|november|dezember|january|february|march|april|may|june|july|august|september|october|november|december)\s+\d{4}",
        ],
        "severity": "MEDIUM",
        "hint": "Die Sub-Processor-Liste muss ein Datum/Stand enthalten. Veraltete Listen (>12 Monate) sind ein haeufiger Beanstandungsgrund bei Audits.",
    },
]
