"""
Request ID Middleware
Adds unique request ID to each request for tracing
"""
from fastapi import Request, Response
from starlette.middleware.base import BaseHTTPMiddleware
import uuid


class RequestIDMiddleware(BaseHTTPMiddleware):
    """
    Adds a unique request ID to each request.
    Useful for distributed tracing and debugging.
    """

    async def dispatch(self, request: Request, call_next) -> Response:
        # Check if request ID is already provided
        request_id = request.headers.get("X-Request-ID")

        if not request_id:
            request_id = str(uuid.uuid4())

        # Store in request state for use in handlers
        request.state.request_id = request_id

        response = await call_next(request)

        # Add request ID to response headers
        response.headers["X-Request-ID"] = request_id

        return response
