from rest_framework import status
from rest_framework.views import APIView
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.permissions import IsAuthenticated
from rest_framework import generics
from .serializers import AdminRegistrationSerializer, AdminTokenObtainPairSerializer
from .customauth import AdminJWTAuthentication
from rest_framework_simplejwt.views import TokenObtainPairView
from utils.helper import success_response, failed_response, generate_random_text
from utils.data import logger_settings
from utils.logger import record
from rest_framework.response import Response

log_msg = logger_settings["msg"]

class AdminRegistrationView(generics.CreateAPIView):
    serializer_class = AdminRegistrationSerializer

    def post(self, request, *args, **kwargs):
        process_code = generate_random_text(6)
        try:
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            self.perform_create(serializer)
            record("info", f"{process_code}: Admin registration successful for {serializer.validated_data['email']}")
            return success_response(msg=serializer.data, code=status.HTTP_201_CREATED)
        except Exception as e:
            record("error", f"{process_code}: Admin registration failed due to: {str(e)}")
            return failed_response(msg=f"An unexpected error occurred: {str(e)}", code=status.HTTP_400_BAD_REQUEST)
    

class AdminLoginView(TokenObtainPairView):
    serializer_class = AdminTokenObtainPairSerializer

    def post(self, request, *args, **kwargs):
        process_code = generate_random_text(6)
        try:
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
            record("info", f"{process_code}: Admin login successful for {request.data.get('username')}")
            return success_response(msg=serializer.validated_data, code=status.HTTP_200_OK)
        except Exception as e:
            record("error", f"{process_code}: Admin login failed for {request.data.get('username')}: {str(e)}")
            return failed_response(msg=f"An unexpected error occurred: {str(e)}", code=status.HTTP_400_BAD_REQUEST)

class AdminLogoutView(APIView):
    authentication_classes = [AdminJWTAuthentication]
    permission_classes = [IsAuthenticated]
    
    def post(self, request):
        process_code = generate_random_text(6)
        refresh_token = request.data.get("refresh_token")
        if not refresh_token:
            record("warn", f"{process_code}: No refresh token provided in logout request.")
            return failed_response(msg="Refresh token is required", code=status.HTTP_400_BAD_REQUEST)
        try:
            token = RefreshToken(refresh_token)
            token.blacklist()
            record("info", f"{process_code}: Admin logout successful. Token blacklisted.")
            return success_response(msg="Logout Successful", code=status.HTTP_200_OK)
        except Exception as e:
            record("error", f"{process_code}: Admin logout failed due to: {str(e)}")
            return failed_response(msg=f"An unexpected error occurred: {str(e)}", code=status.HTTP_400_BAD_REQUEST)
        
class Ping(APIView):
    def get(self, request):
        return Response({"message": "API is working"}, status=status.HTTP_200_OK)