"""Sentry kurulumu — DSN yoksa no-op.

KVKK ve hukuki kurallar gereği:
- send_default_pii=False (varsayılan) — kullanıcı adı, email vs. gönderilmez
- before_send ile patent içeriğini (intake, draft, claim text) filtreliyoruz
"""

from __future__ import annotations

import logging
from typing import Any

import sentry_sdk
from sentry_sdk.integrations.asyncio import AsyncioIntegration
from sentry_sdk.integrations.fastapi import FastApiIntegration
from sentry_sdk.integrations.httpx import HttpxIntegration
from sentry_sdk.integrations.starlette import StarletteIntegration

from app.config import get_settings

_PATENT_CONTENT_KEYS = frozenset(
    {
        "invention_intake",
        "description_draft",
        "abstract_draft",
        "claims_draft",
        "applicant_name",
        "inventor_names",
        "intake",
        "description",
        "abstract",
        "claims",
    }
)


def _scrub_patent_content(event: dict[str, Any], _hint: dict[str, Any]) -> dict[str, Any]:
    """Sentry event'inden patent taslak içeriğini kaldır.

    Patent draft'ları gizli kabul edilir (mucit ile vekil arasında vekaletname
    altında) — Sentry'ye sızdırmak hukuki risk.
    """
    for ctx in ("request", "extra", "contexts"):
        data = event.get(ctx)
        if isinstance(data, dict):
            _scrub_dict(data)
    return event


def _scrub_dict(d: dict[str, Any]) -> None:
    for key in list(d.keys()):
        if key.lower() in _PATENT_CONTENT_KEYS:
            d[key] = "[REDACTED]"
        elif isinstance(d[key], dict):
            _scrub_dict(d[key])


def setup_sentry() -> None:
    """Sentry'yi başlat. DSN yoksa no-op, dev/test'i bozmaz."""
    settings = get_settings()
    if not settings.sentry_dsn:
        logging.getLogger(__name__).info("Sentry DSN yok — izleme devre dışı")
        return

    sentry_sdk.init(
        dsn=settings.sentry_dsn,
        environment=settings.sentry_environment,
        traces_sample_rate=settings.sentry_traces_sample_rate,
        send_default_pii=False,
        integrations=[
            StarletteIntegration(),
            FastApiIntegration(),
            AsyncioIntegration(),
            HttpxIntegration(),
        ],
        before_send=_scrub_patent_content,
        # /api/v1/health UptimeRobot tarafından sürekli vurulur — transaction yaratma
        traces_sampler=_traces_sampler,
    )


def _traces_sampler(sampling_context: dict[str, Any]) -> float:
    settings = get_settings()
    request = sampling_context.get("asgi_scope", {})
    path = request.get("path", "") if isinstance(request, dict) else ""
    if path.startswith("/api/v1/health"):
        return 0.0
    return settings.sentry_traces_sample_rate
