from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework.generics import ListAPIView, UpdateAPIView, RetrieveAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status, parsers

from apps.user.models import Permission, Role, User
from apps.user.serializers.user_serializers import UserLoginSerializer, UserDetailSerializer,\
UserPermissionAPISerializer, UserEditProfileSerializer, ChangePasswordSerializer



class UserLoginAPIView(TokenObtainPairView):
    serializer_class = UserLoginSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data, context={'request': request})
        serializer.is_valid(raise_exception=True)

        return Response(serializer.validated_data, status=status.HTTP_200_OK)


class UserPermissionAPIView(ListAPIView):
    serializer_class = UserPermissionAPISerializer
    pagination_class = None

    def get(self, request, *args, **kwargs):

        permissions = Role.objects.filter(id=self.request.user.role_id).first().permissions.values_list('name', flat=True)

        return Response({
            'permissions': list(permissions) if permissions else []
        })

class UserProfileUpdateAPIView(UpdateAPIView):
    http_method_names = ['patch']
    serializer_class = UserEditProfileSerializer
    permission_classes = [IsAuthenticated]
    parser_classes = (parsers.MultiPartParser,)

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        serializer = self.get_serializer(request.user, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data)


class UserDetailAPIView(RetrieveAPIView):
    serializer_class = UserDetailSerializer
    queryset = User.objects.all()


class ChangePasswordAPIView(APIView):

    def post(self, request):

        serializer = ChangePasswordSerializer(data=request.data, context={'request': request})

        if serializer.is_valid():
            user = request.user
            new_password = serializer.validated_data['new_password']
            user.set_password(new_password)
            user.save()
            return Response({"message": "Password changed successfully."}, status=status.HTTP_200_OK)
        else:
            return Response({"success": False, "message": "Failed to change password.", "data": serializer.errors}, status=status.HTTP_400_BAD_REQUEST)