"""
apps/business/network_chat/auth_middleware.py

JWT auth middleware for Channels WebSocket connections.
Reads ?token=<access_token> from query string and sets scope['user'].
"""

from urllib.parse import parse_qs

from channels.auth import AuthMiddlewareStack
from channels.db import database_sync_to_async
from django.contrib.auth.models import AnonymousUser
from rest_framework_simplejwt.authentication import JWTAuthentication


@database_sync_to_async
def _get_user_from_token(token: str):
    if not token:
        return AnonymousUser()

    jwt_auth = JWTAuthentication()
    try:
        validated_token = jwt_auth.get_validated_token(token)
        user = jwt_auth.get_user(validated_token)
        return user if user and user.is_active else AnonymousUser()
    except Exception:
        return AnonymousUser()


class JWTQueryAuthMiddleware:
    """Authenticate websocket user from JWT query parameter."""

    def __init__(self, inner):
        self.inner = inner

    async def __call__(self, scope, receive, send):
        query_string = scope.get("query_string", b"").decode("utf-8")
        token_list = parse_qs(query_string).get("token", [])
        token = token_list[0] if token_list else ""
        scope["user"] = await _get_user_from_token(token)
        return await self.inner(scope, receive, send)


def JWTAuthMiddlewareStack(inner):
    """Combine default auth stack with JWT query auth override."""
    return JWTQueryAuthMiddleware(AuthMiddlewareStack(inner))
