"""Global error handling middleware."""

import logging
import time
import uuid

from fastapi import Request
from fastapi.responses import JSONResponse
from starlette.middleware.base import BaseHTTPMiddleware

logger = logging.getLogger(__name__)


class ErrorHandlingMiddleware(BaseHTTPMiddleware):
    """Catch unhandled exceptions and return structured JSON error responses."""

    async def dispatch(self, request: Request, call_next):
        request_id = uuid.uuid4().hex[:8]
        start = time.time()

        try:
            response = await call_next(request)
            elapsed = time.time() - start
            logger.info(
                "%s %s -> %s (%.3fs) [%s]",
                request.method,
                request.url.path,
                response.status_code,
                elapsed,
                request_id,
            )
            response.headers["X-Request-ID"] = request_id
            return response
        except Exception:
            elapsed = time.time() - start
            logger.exception(
                "Unhandled error: %s %s (%.3fs) [%s]",
                request.method,
                request.url.path,
                elapsed,
                request_id,
            )
            return JSONResponse(
                status_code=500,
                content={
                    "detail": "서버 내부 오류가 발생했습니다.",
                    "request_id": request_id,
                },
                headers={"X-Request-ID": request_id},
            )
