from rest_framework.authentication import TokenAuthentication
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.authtoken.models import Token
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.permissions import BasePermission
from user.models import User

class ApiTokenAuthentication(TokenAuthentication):
    keyword = 'Api-Key'
    
    def authenticate_credentials(self, key):
        try:
            token = Token.objects.select_related('user').get(key=key)
        except Token.DoesNotExist:
            raise AuthenticationFailed('Token invalide')

        if not token.user.is_active:
            raise AuthenticationFailed('Utilisateur inactif ou supprimé')

        return (token.user, token)

class JWTAuthenticationWithUserCheck(JWTAuthentication):
    """
    Extension de JWTAuthentication qui vérifie également l'état de l'utilisateur
    """
    def authenticate(self, request):
        authenticated = super().authenticate(request)
        if authenticated is None:
            return Response({'error': 'Token invalide'}, status=status.HTTP_401_UNAUTHORIZED)

        user, token = authenticated
        if not user.is_active:
            return Response({'error': 'Utilisateur inactif ou supprimé'}, status=status.HTTP_401_UNAUTHORIZED)

        return (user, token)

class IsAuthenticated(BasePermission):
    """
    Permission qui vérifie si l'utilisateur est authentifié.
    """
    
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated

class IsAuthenticatedAndOwner(BasePermission):
    """
    Permission qui vérifie si l'utilisateur est authentifié
    et s'il est le propriétaire de la ressource.
    """
    
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated
    
    def has_object_permission(self, request, view, obj):
        if hasattr(obj, 'user'):
            return str(obj.user) == str(request.user)
        if hasattr(obj, 'publicIdentifier'):
            return str(obj.publicIdentifier) == str(request.user.publicIdentifier)
        return False

class IsAuthenticatedOrCreateOnly(BasePermission):
    """
    Permission qui permet l'accès aux utilisateurs authentifiés
    ou autorise uniquement la création pour les non-authentifiés
    """
    def has_permission(self, request, view):
        if request.method == 'POST':
            return True
        return request.user and request.user.is_authenticated

class IsAuthenticatedOrEmailVerified(BasePermission):
    """
    Permission qui permet l'accès aux utilisateurs authentifiés
    ou à ceux qui ont vérifié leur email avec un code
    """
    def has_permission(self, request, view):
        if request.user and request.user.is_authenticated:
            return True
        
        if request.data.get('email'):
            user = User.objects.get(email=request.data.get('email'))
            if user.is_active:
                return True
                # renvoie true tout le temps, on pourra éventuellement ajouter des vérifications plus poussées si nécessaire
        return True

        