from datetime import datetime, timedelta
from django.utils import timezone
from user.models import User



def has_tokens(user: User, special_service = False) -> bool:
    """
    Vérifie si l'utilisateur peut encore utiliser des tokens.
    
    Args:
        user (User): L'utilisateur à vérifier
        
    Returns:
        bool: True si l'utilisateur peut utiliser des tokens, False sinon
    """
    
    return True # Periode de gratuité totale

    # Vérifie si l'utilisateur a dépassé sa limite
    # Les effets des packs s'appliquent en priorité
    if len(user.packs) > 0:
        for pack in user.packs:
            if pack['end_date'] < timezone.now():
                return True
    if user.abonnement_type == "FR":
        if user.tokens_reset_date and user.tokens_reset_date > timezone.now():
            if user.tokens_used < user.tokens_limit:
                return True
    elif user.abonnement_type == "BS":
        if user.tokens_reset_date < timezone.now():
            user.abonnement_end_date = timezone.now() + timedelta(days=30)
            user.tokens_reset_date = timezone.now() + timedelta(days=30)
            user.tokens_used = 0
            user.special_service_used = 0
            user.save()
        if not special_service:
            return True
        if user.special_service_used < 6:
            return True
            
    elif user.abonnement_type == "PR":
        if user.abonnement_end_date < timezone.now():
            user.abonnement_end_date = timezone.now() + timedelta(days=30)
            user.save()
        return True
    
    return False



def add_tokens_used(user: User, tokens_count: int) -> None:
    """
    Ajoute le nombre de tokens utilisés au total de l'utilisateur.
    
    Args:
        user (User): L'utilisateur concerné
        tokens_count (int): Le nombre de tokens à ajouter
    """
    user.tokens_used += tokens_count
    user.save()
    print(f"Tokens utilisés: {user.tokens_used}")

def reset_user_tokens(user: User, reset_date: datetime) -> None:
    """
    Réinitialise les compteurs de tokens de l'utilisateur.
    
    Args:
        user (User): L'utilisateur dont il faut réinitialiser les compteurs
    """
    user.tokens_used = 0
    user.tokens_reset_date = reset_date
    user.save()