"""
Custom JWT token classes for temporary users.

Provides permanent (never-expiring) JWT tokens specifically for temporary users
to ensure they have forever sessions as intended.
"""

from datetime import timedelta
from rest_framework_simplejwt.tokens import RefreshToken, AccessToken
from rest_framework_simplejwt.settings import api_settings


class PermanentAccessToken(AccessToken):
    """
    Access token that never expires - used for temporary users.
    
    This token has a very long lifetime (100 years) to ensure temporary users
    never have to deal with token expiration.
    """
    lifetime = timedelta(days=36500)  # ~100 years


class PermanentRefreshToken(RefreshToken):
    """
    Refresh token that never expires - used for temporary users.
    
    This token has a very long lifetime (100 years) and generates
    PermanentAccessToken instances for access tokens.
    """
    lifetime = timedelta(days=36500)  # ~100 years
    access_token_class = PermanentAccessToken
    
    @property
    def access_token(self):
        """
        Returns an access token created from this refresh token.
        Uses PermanentAccessToken for temporary users.
        """
        access = self.access_token_class()
        access.set_exp(from_time=self.current_time, lifetime=self.access_token_class.lifetime)
        
        # Copy claims from refresh token to access token
        for claim, value in self.payload.items():
            if claim in api_settings.USER_ID_CLAIM:
                access[api_settings.USER_ID_CLAIM] = value
            elif claim == 'token_type':
                # Skip token_type - will be set by AccessToken
                continue
            elif claim not in ('exp', 'iat', 'jti'):
                # Copy other claims except expiry, issued at, and JWT ID
                access[claim] = value
        
        return access


def create_tokens_for_user(user):
    """
    Create appropriate JWT tokens for a user.
    
    Returns permanent tokens for temporary users, standard tokens for regular users.
    
    Args:
        user: User instance
        
    Returns:
        dict: Dictionary containing 'access' and 'refresh' token strings
    """
    if getattr(user, 'is_temporary_user', False):
        # Use permanent tokens for temporary users
        refresh = PermanentRefreshToken.for_user(user)
        return {
            'access': str(refresh.access_token),
            'refresh': str(refresh),
            'expires_in': None,  # Never expires
            'is_permanent': True
        }
    else:
        # Use standard tokens for regular users
        refresh = RefreshToken.for_user(user)
        return {
            'access': str(refresh.access_token),
            'refresh': str(refresh),
            'expires_in': int(api_settings.ACCESS_TOKEN_LIFETIME.total_seconds()),
            'is_permanent': False
        } 