from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.permissions import IsAuthenticated
from rest_framework import serializers
from .throttles import AdminLoginThrottle

from .serializers import LoginSerializer, CurrentUserSerializer



class AdminLoginView(APIView):

    authentication_classes = []

    permission_classes = []

    throttle_classes = [AdminLoginThrottle]

    def post(self, request):

        serializer = LoginSerializer(data=request.data)

        serializer.is_valid(raise_exception=True)

        user = serializer.validated_data["user"]

        if not user.is_staff:

            return Response({"detail": ("You do not have admin access.")},
                status=status.HTTP_403_FORBIDDEN
            )
        
        if not user.is_active:
            raise serializers.ValidationError("Account disabled")

        refresh = RefreshToken.for_user(user)

        return Response({
            "access": str(refresh.access_token),
            "refresh": str(refresh),
            "user": {
                "id": user.id,
                "username": user.username,
                "email": user.email,
                "display_name": user.display_name,
            }
        })
    
class CurrentUserView(APIView):

    permission_classes = [
        IsAuthenticated
    ]

    def get(self, request):

        serializer = CurrentUserSerializer(
            request.user
        )

        return Response(
            serializer.data
        )
    

class LogoutView(APIView):

    permission_classes = [IsAuthenticated]

    def post(self, request):

        try:
            refresh_token = request.data["refresh"]

            token = RefreshToken(refresh_token)

            token.blacklist()

            return Response({"message": "Logged out"})

        except Exception:

            return Response({"detail": "Invalid token"}, status=400)