import logging

from django.contrib.auth import authenticate
from rest_framework import authentication, exceptions

from django_airavata.apps.auth.middleware import set_admin_group_attributes

logger = logging.getLogger(__name__)


class OAuthAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):

        if 'HTTP_AUTHORIZATION' in request.META:
            try:
                user = authenticate(request=request)
                if user is None:
                    raise exceptions.AuthenticationFailed(
                        "Token failed to authenticate")
                _, token = request.META.get('HTTP_AUTHORIZATION').split()

                logger.debug(f"OAuthAuthentication authenticated user {user}")
                # Set request attributes that are normally set by middleware
                set_admin_group_attributes(request)
                return (user, token)
            except Exception as e:
                raise exceptions.AuthenticationFailed(
                    "Token failed to authenticate") from e
        else:
            return None
