# app_login/backends.py

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

class EmailOrUsernameBackend(ModelBackend):
    """
    Este é o nosso backend de autenticação personalizado.
    Ele tenta autenticar o usuário usando o email ou o nome de usuário.
    """
    def authenticate(self, request, username=None, password=None, **kwargs):
        # Pega o modelo de usuário padrão do Django
        UserModel = get_user_model()
        
        try:
            # Tenta encontrar um usuário que corresponda ao username OU ao email.
            # Q() é uma ferramenta do Django para criar queries complexas (com OU).
            # __iexact faz a busca ser case-insensitive (não diferencia maiúsculas de minúsculas).
            user = UserModel.objects.get(
                Q(username__iexact=username) | Q(email__iexact=username)
            )
            
            # Se encontrou um usuário, verifica se a senha está correta.
            if user.check_password(password):
                return user  # Retorna o objeto do usuário se tudo estiver certo.

        except UserModel.DoesNotExist:
            # Se nenhum usuário foi encontrado, a autenticação falha.
            return None

    def get_user(self, user_id):
        UserModel = get_user_model()
        try:
            return UserModel.objects.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None