from django.contrib.auth import get_user_model

from kfet.models import Account, GenericTeamToken

from .utils import get_kfet_generic_user

User = get_user_model()


class BaseKFetBackend:
    def get_user(self, user_id):
        """
        Add extra select related up to Account.
        """
        try:
            return User.objects.select_related("profile__account_kfet").get(pk=user_id)
        except User.DoesNotExist:
            return None


class AccountBackend(BaseKFetBackend):
    def authenticate(self, request, kfet_password=None):
        try:
            return Account.objects.get_by_password(kfet_password).user
        except Account.DoesNotExist:
            return None


class GenericBackend(BaseKFetBackend):
    def authenticate(self, request, kfet_token=None):
        try:
            team_token = GenericTeamToken.objects.get(token=kfet_token)
        except GenericTeamToken.DoesNotExist:
            return

        # No need to keep the token.
        team_token.delete()

        return get_kfet_generic_user()