"""Хук before_send_transaction для GlitchTip/Sentry SDK.

Redact-ит api keys / tokens из URL-spans перед отправкой — чтобы
секреты (apiKey=..., api_key=..., token=...) не утекали в GlitchTip
через HttpxIntegration performance-spans.
"""

from __future__ import annotations

import re
from typing import Any

from sentry_sdk.types import Event

_SENSITIVE_PARAM_RE = re.compile(
    r"((?:api[_-]?[Kk]ey|token|access[_-]?token|secret)=)([^&\s]+)",
    re.IGNORECASE,
)


def _redact(value: Any) -> Any:
    """Заменить значения чувствительных query-параметров на [REDACTED]."""
    if isinstance(value, str):
        return _SENSITIVE_PARAM_RE.sub(r"\1[REDACTED]", value)
    return value


def scrub_sensitive_query(event: Event, _hint: dict[str, Any]) -> Event | None:
    """Redact api keys / tokens из URL spans перед отправкой в GlitchTip.

    Обрабатывает:
    - span.data["url"], span.data["http.url"], span.data["http.target"]
    - span["description"]
    - event["request"]["url"]
    """
    for span in event.get("spans") or []:
        data = span.get("data")
        if isinstance(data, dict):
            for key in ("url", "http.url", "http.target"):
                if key in data:
                    data[key] = _redact(data[key])
        if "description" in span:
            span["description"] = _redact(span["description"])

    request = event.get("request")
    if isinstance(request, dict) and "url" in request:
        request["url"] = _redact(request["url"])

    return event
