from django.utils.translation import gettext_lazy as _
from rest_framework import exceptions
from rest_framework.authentication import TokenAuthentication

from api_tokens.models import APIToken


class BearerTokenAuthentication(TokenAuthentication):
    """
    Customized TokenAuthentication to support the APIToken model
    and sentry-cli's usage of bearer 
    """

    keyword = "Bearer"
    model = APIToken

    def authenticate_credentials(self, key):
        model = self.get_model()
        try:
            token = model.objects.select_related("user").get(token=key)
        except model.DoesNotExist:
            raise exceptions.AuthenticationFailed(_("Invalid token."))

        if not token.user.is_active:
            raise exceptions.AuthenticationFailed(_("User inactive or deleted."))

        return (token.user, token)