from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.exceptions import AuthenticationFailed
from django.utils import timezone
from datetime import timedelta
from .models import UserSession, SessionConfiguration

class SessionJWTAuthentication(JWTAuthentication):
    def get_user(self, validated_token):
        user = super().get_user(validated_token)
        session_key = validated_token.get("session_key")
        if session_key:
            try:
                session = UserSession.objects.get(session_key=session_key)
                if not session.is_active:
                    raise AuthenticationFailed("Session is inactive or has been revoked.")
                
                # Fetch settings
                config = SessionConfiguration.get_settings()
                now = timezone.now()

                # Check absolute expiry
                expiry_delta = timedelta(hours=config.absolute_expiry_hours)
                if now - session.created_at > expiry_delta:
                    session.is_active = False
                    session.save(update_fields=["is_active"])
                    raise AuthenticationFailed("Session absolute lifetime has expired.")

                # Check inactivity timeout
                inactivity_delta = timedelta(minutes=config.inactivity_timeout_minutes)
                if now - session.last_activity > inactivity_delta:
                    session.is_active = False
                    session.save(update_fields=["is_active"])
                    raise AuthenticationFailed("Session has timed out due to inactivity.")

                # Update last_activity to show activity
                session.last_activity = now
                session.save(update_fields=["last_activity"])
            except UserSession.DoesNotExist:
                raise AuthenticationFailed("Session does not exist.")
        return user
