import json, logging, time, uuid
from contextvars import ContextVar
from fastapi import Request
from app.services.observability import record_http
request_id_ctx=ContextVar('request_id',default='')
class JsonFormatter(logging.Formatter):
    def format(self,record):
        return json.dumps({'timestamp':self.formatTime(record),'level':record.levelname,'service':'cedp-api','event':record.name,'message':record.getMessage(),'request_id':request_id_ctx.get()},ensure_ascii=False)
def configure_logging():
    handler=logging.StreamHandler(); handler.setFormatter(JsonFormatter()); root=logging.getLogger(); root.handlers=[handler]; root.setLevel(logging.INFO)
async def telemetry_middleware(request:Request,call_next):
    rid=request.headers.get('x-request-id') or str(uuid.uuid4()); request_id_ctx.set(rid); started=time.perf_counter(); status=500
    try:
        response=await call_next(request); status=response.status_code; response.headers['X-Request-ID']=rid; return response
    finally:
        duration=int((time.perf_counter()-started)*1000); record_http(status,duration)
        logging.getLogger('http').info('%s %s status=%s duration_ms=%s',request.method,request.url.path,status,duration)


def configure_tracing(app):
    if not getattr(__import__('app.core.config',fromlist=['settings']).settings,'otel_exporter_otlp_endpoint',''):
        return
    try:
        from opentelemetry import trace
        from opentelemetry.sdk.resources import Resource
        from opentelemetry.sdk.trace import TracerProvider
        from opentelemetry.sdk.trace.export import BatchSpanProcessor
        from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
        from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
        endpoint=__import__('app.core.config',fromlist=['settings']).settings.otel_exporter_otlp_endpoint
        provider=TracerProvider(resource=Resource.create({'service.name':'cedp-api','service.version':'0.13.0'}))
        provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint=endpoint,insecure=endpoint.startswith('http://'))))
        trace.set_tracer_provider(provider); FastAPIInstrumentor.instrument_app(app)
    except Exception:
        logging.getLogger('telemetry').exception('Falha ao configurar OpenTelemetry')
