from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.exceptions import InvalidToken
from rest_framework.exceptions import AuthenticationFailed
from webapp.models.master import Users


class CustomUserWrapper:
    """
    Wrapper supaya object Users lama bisa dipakai di DRF
    dengan property standar (is_authenticated, is_anonymous).
    """
    def __init__(self, user):
        self._user = user

    @property
    def is_authenticated(self):
        return True

    @property
    def is_anonymous(self):
        return False

    def __getattr__(self, attr):
        # fallback → kalau atribut nggak ada di wrapper,
        # diteruskan ke object Users asli
        return getattr(self._user, attr)


class CustomJWTAuthentication(JWTAuthentication):
    """
    Custom JWT Authentication pakai tabel Users lama
    bukan django.contrib.auth.models.User.
    """

    def get_user(self, validated_token):
        user_id = validated_token.get("user_id")

        if not user_id:
            raise InvalidToken("Token tidak mengandung user_id")

        try:
            user = Users.objects.select_related("pk_roles").get(_pk=user_id)
        except Users.DoesNotExist:
            raise AuthenticationFailed("User tidak ditemukan", code="user_not_found")

        # balikin wrapper biar bisa dipakai DRF
        return CustomUserWrapper(user)
