"""統制6: エージェント側のトレース。agent-tools / 基幹と同じ Tempo に送り、一本のトレースにする。"""

import json
import os
import urllib.parse

from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.propagate import inject
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

_provider: TracerProvider | None = None


def setup(service_name: str = "agent-concierge") -> trace.Tracer:
    global _provider
    if _provider is None:
        endpoint = os.getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "http://localhost:4318/v1/traces")
        _provider = TracerProvider(resource=Resource.create({
            "service.name": service_name,
            "service.namespace": "agent-safe-connect",
            "deployment.environment": "demo",
        }))
        _provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint=endpoint)))
        trace.set_tracer_provider(_provider)
    return trace.get_tracer("asc_agent")


def shutdown() -> None:
    if _provider is not None:
        _provider.force_flush()
        _provider.shutdown()


def trace_headers() -> dict[str, str]:
    """現在のスパンを W3C traceparent ヘッダーにする。MCP 要求に付けて送る。"""
    carrier: dict[str, str] = {}
    inject(carrier)
    return carrier


GRAFANA = os.getenv("GRAFANA_URL", "http://localhost:3000")


def trace_url(trace_id: str) -> str:
    """Grafana の Explore で、Tempo のトレースを開く URL。"""
    panes = {"a": {"datasource": "tempo", "queries": [{"refId": "A", "datasource": {"type": "tempo", "uid": "tempo"},
                                                         "queryType": "traceql", "query": trace_id}],
                   "range": {"from": "now-1h", "to": "now"}}}
    return f"{GRAFANA}/explore?schemaVersion=1&orgId=1&panes=" + urllib.parse.quote(json.dumps(panes, separators=(",", ":")))


def trace_id_hex() -> str:
    ctx = trace.get_current_span().get_span_context()
    return format(ctx.trace_id, "032x") if ctx.is_valid else ""
