"""
Backend module for users app.
"""
from django.contrib.auth import backends
from django.contrib.auth import get_user_model


class EmailAuthBackend(backends.ModelBackend):
    """
    Email Authentication Backend

    Allows a user to sign in using an email/password pair, then check
    a username/password pair if email failed
    """

    # pylint: disable=W0221
    def authenticate(self, request, username=None, password=None):
        """
        Authenticate a user based on email address as the user name.
        """
        user_model = get_user_model()
        try:
            user = user_model.objects.get(email=username)
            if user.check_password(password):
                return user
        except user_model.DoesNotExist:
            try:
                user = user_model.objects.get(username=username)
                if user.check_password(password):
                    return user
                return None
            except user_model.DoesNotExist:
                return None

        return None

    def get_user(self, user_id):
        """Get a User object from the user_id."""
        user_model = get_user_model()
        try:
            return user_model.objects.get(pk=user_id)
        except user_model.DoesNotExist:
            return None
