text: from watchlist_app.models import (WatchList,
                                    StreamPlatform,
                                    Review)
  
  from .serializers import (WatchListSerializer,
                            StreamPlatformSerializer,
                            ReviewSerializer)
  
  from rest_framework import status
  from rest_framework.views import APIView
  from rest_framework.response import Response
  from rest_framework.decorators import api_view
  
  # from rest_framework import mixins
  from rest_framework import generics
  
  
  class ReviewCreate(generics.CreateAPIView):
      serializer_class = ReviewSerializer
  
      def perform_create(self, serializer):   # overwriting create method
          pk = self.kwargs['pk']
          movie = WatchList.objects.get(pk=pk)
  
          serializer.save(watchlist=movie)
  
  
  class ReviewList(generics.ListCreateAPIView):
      # queryset = Review.objects.all()   #overwriting queryset
      serializer_class = ReviewSerializer
  
      def get_queryset(self):
          pk = self.kwargs['pk']
          return Review.objects.filter(watchlist=pk)
  
  
  class ReviewDetail(generics.RetrieveUpdateDestroyAPIView):
      queryset = Review.objects.all()
      serializer_class = ReviewSerializer
  
  
  # class ReviewDetail(mixins.RetrieveModelMixin, generics.GenericAPIView):
  #     queryset = Review.objects.all()
  #     serializer_class = ReviewSerializer
  
  #     def get(self, request, *args, **kwargs):
  #         return self.retrieve(request, *args, **kwargs)
  
  # # Generic view class using mixins
  # class ReviewList(mixins.ListModelMixin,
  #                   mixins.CreateModelMixin,
  #                   generics.GenericAPIView):
  #     queryset = Review.objects.all()
  #     serializer_class = ReviewSerializer
  
  #     def get(self, request, *args, **kwargs):
  #         return self.list(request, *args, **kwargs)
  
  #     def post(self, request, *args, **kwargs):
  #         return self.create(request, *args, **kwargs)
  
  
  class WatchListAV(APIView):
  
      def get(self, request):
          movies = WatchList.objects.all()
          serializer = WatchListSerializer(movies, many=True)
          return Response(serializer.data, status=status.HTTP_200_OK)
  
      def post(self, request):
          serializer = WatchListSerializer(data=request.data)
          if serializer.is_valid():
              serializer.save()
              return Response(serializer.data, status=status.HTTP_201_CREATED)
          else:
              return Response(serializer.errors, status=status.HTTP_404_NOT_FOUND)
  
  
  class WatchListDetailAV(APIView):
  
      def get(self, request, pk):
          try:
              movie = WatchList.objects.get(pk=pk)
          except WatchList.DoesNotExist:
              return Response({"Error": "Movie does not exist"}, status=status.HTTP_404_NOT_FOUND)
  
          serializer = WatchListSerializer(movie)
          return Response(serializer.data, status=status.HTTP_200_OK)
  
      def put(self, request, pk):
          try:
              movie = WatchList.objects.get(pk=pk)
          except WatchList.DoesNotExist:
              return Response({"Error": "Movie does not exist"}, status=status.HTTP_404_NOT_FOUND)
  
          serializer = WatchListSerializer(movie, data=request.data)
          if serializer.is_valid():
              serializer.save()
              return Response(serializer.data, status=status.HTTP_200_OK)
          else:
              return Response(serializer.errors, status=status.HTTP_404_NOT_FOUND)
  
      def delete(self, request, pk):
          movie = WatchList.objects.get(pk=pk)
          movie.delete()
          return Response({'Success': 'Deleted'})
  
  
  class StreamPlatformAV(APIView):
      def get(self, request):
          platforms = StreamPlatform.objects.all()
          serializers = StreamPlatformSerializer(platforms, many=True)
          return Response(serializers.data, status=status.HTTP_200_OK)
  
      def post(self, request):
          serializer = StreamPlatformSerializer(data=request.data)
          if serializer.is_valid():
              serializer.save()
              return Response(serializer.data, status=status.HTTP_201_CREATED)
          return Response(serializer.errors, status=status.HTTP_404_NOT_FOUND)
  
  
  class StreamPlatformDetailAV(APIView):
      # Get request using pk (fetching particular database id)
      def get(self, request, pk):
          try:
              platform = StreamPlatform.objects.get(pk=pk)
              serializer = StreamPlatformSerializer(platform)
              return Response(serializer.data, status=status.HTTP_200_OK)
          except StreamPlatform.DoesNotExist:
              return Response({"Errors": "StreamPlatform Does Not Exist"}, status=status.HTTP_404_NOT_FOUND)
              
      # Update in database with pk
      def put(self, request, pk):
          platform = StreamPlatform.objects.get(pk=pk)
          serializer = StreamPlatformSerializer(platform, data=request.data)
          if serializer.is_valid():
              serializer.save()
              return Response(serializer.data, status=status.HTTP_200_OK)
          return Response(serializer.errors, status=status.HTTP_404_NOT_FOUND)
  
      # Deletetion in database with pk
      def delete(self, request, pk):
          platform = StreamPlatform.objects.get(pk=pk)
          platform.delete()
          return Response({"Success": "Deleted"}, status=status.HTTP_200_OK)
  