"""B8 — CMP-Provider-Fingerprint-Check.

Findings wenn:
- Cookie-Banner wurde erkannt (banner_result.detected=True)
- Aber CMP-Provider/Vendor nicht ableitbar (provider in {Generic, "", "?"})

Das ist nach EDPB-Taskforce-Methodik MEDIUM: ohne klare CMP-Identität
ist schwer zu beurteilen, welches Consent-Storage-Format greift, ob
TCF unterstützt wird, und wie der DSB mit dem CMP-Anbieter
kommunizieren kann (Audit-Trail / DPA).

Provider-Detection läuft schon im consent-tester. Hier nur die
Lückenmeldung wenn der Banner zwar steht aber der Anbieter offen
bleibt.
"""

from __future__ import annotations

import logging

logger = logging.getLogger(__name__)


_KNOWN_PROVIDERS = (
    "usercentrics", "onetrust", "cookiebot", "cookiepro",
    "sourcepoint", "consentmanager", "klaro!", "borlabs",
    "iubenda", "didomi", "trustarc", "complianz",
)


def check_cmp_fingerprint(state: dict) -> dict | None:
    br = state.get("banner_result") or {}
    detected = br.get("detected") or br.get("banner_detected")
    if not detected:
        return None
    provider = (br.get("provider") or br.get("banner_provider") or "").lower()
    is_known = any(k in provider for k in _KNOWN_PROVIDERS)
    if is_known:
        return None
    # Banner steht, aber CMP-Provider ist generisch oder leer.
    finding = {
        "check_id": "COOKIE-CONSENT-UX-002",
        "severity": "MEDIUM",
        "severity_reason": "incomplete",
        "title": "Cookie-Banner erkannt, aber CMP-Provider nicht eindeutig",
        "norm": "EDPB Cookie Banner Taskforce-Report (Transparenz CMP)",
        "detected_provider": provider or "—",
        "action": (
            "CMP-Provider in der DSE benennen (Auftragsverarbeiter), "
            "Consent-Storage-Format dokumentieren (TCF / proprietär), "
            "und Audit-Trail-Zugang für den DSB sicherstellen."
        ),
    }
    logger.info("B8 CMP-fingerprint: detected_provider=%r is generic", provider)
    return finding
