"""Shared safety helpers for GetMyInvoices workflows.

Enthält den rekursiven Strip-Filter für Felder, die NIE in den LLM-Kontext
gehen duerfen (insbesondere `fileContent` aus `getOneDocument` und
`getOneAttachment`, die base64-kodierte Binärinhalte liefern).

Ein einziger Import, damit kein Workflow den Filter "vergisst" oder
abweichend implementiert. Alle neuen Workflows, die Endpoints nutzen,
die `fileContent` zurückliefern können, MÜSSEN `_strip_forbidden`
verwenden.
"""
from __future__ import annotations

from typing import Any

# Felder, die rekursiv aus jedem Response-Dict entfernt werden.
# Der Set-Vergleich ist case-sensitive — die API nutzt beides nicht gemischt,
# aber wir fangen trotzdem beide Schreibweisen ab.
FORBIDDEN_FIELDS: frozenset[str] = frozenset({
    "fileContent",
    "file_content",
})


def _strip_forbidden(data: Any) -> Any:
    """Entfernt FORBIDDEN_FIELDS rekursiv aus Dicts und verschachtelten Strukturen.

    - Dicts: alle verbotenen Keys werden entfernt, Werte rekursiv bereinigt
    - Listen: jedes Element rekursiv bereinigt
    - Andere Typen: unverändert zurückgegeben

    Returns:
      Eine neue Struktur (Input wird nicht mutiert).
    """
    if isinstance(data, dict):
        return {
            k: _strip_forbidden(v)
            for k, v in data.items()
            if k not in FORBIDDEN_FIELDS
        }
    if isinstance(data, list):
        return [_strip_forbidden(x) for x in data]
    return data
