"""
==================================================
Smart Attendance AI
Request Context Middleware
==================================================
- Generates Request ID
- Records Request Start Time
- Makes request metadata available
==================================================
"""

import time
import uuid

from starlette.middleware.base import BaseHTTPMiddleware

from config.logger import logger


class RequestContextMiddleware(BaseHTTPMiddleware):

    async def dispatch(
        self,
        request,
        call_next
    ):

        # ==========================================
        # Request ID
        # ==========================================

        request.state.request_id = str(
            uuid.uuid4()
        )

        # ==========================================
        # Request Start Time
        # ==========================================

        request.state.start_time = time.perf_counter()

        logger.info(

            "[%s] %s %s",

            request.state.request_id,

            request.method,

            request.url.path

        )

        response = await call_next(request)

        # ==========================================
        # Response Headers
        # ==========================================

        response.headers["X-Request-ID"] = (
            request.state.request_id
        )

        return response