# api/authentication/middleware.py

from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.exceptions import InvalidToken, TokenError


class JWTParamMiddleware:
    """
    Middleware that allows JWT authentication via query parameters.

    This middleware extracts a JWT token from a query parameter named 'token'
    and authenticates the user if the token is valid.
    """

    def __init__(self, get_response):
        self.get_response = get_response
        self.jwt_auth = JWTAuthentication()

    def __call__(self, request):
        self._authenticate_token_param(request)
        response = self.get_response(request)
        return response

    def _authenticate_token_param(self, request):
        # Don't authenticate if already authenticated via headers
        if hasattr(request, "user") and request.user.is_authenticated:
            return

        # Get token from the query parameter
        token = request.GET.get("token")
        if not token:
            return

        # Validate the token
        try:
            validated_token = self.jwt_auth.get_validated_token(token)
            user = self.jwt_auth.get_user(validated_token)

            # Set the authenticated user on the request
            request.user = user

            # Also set auth in DRF format for API views
            request._auth = validated_token
        except (InvalidToken, TokenError):
            # Don't raise exceptions, just leave as anonymous
            pass