from rest_framework import generics, status
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
# from api.producers_api.accounts.models import User
from users.models import User
from api.producers_api.cart.models import Cart, CartItem
from api.producers_api.cart.serializers.cart_item import CartItemSerializer
from producers_products_variants.models.products_vairants import ProductsVariants
from rest_framework.filters import OrderingFilter
from common.pagination.custom_pagination import CustomPageNumberPagination

class CartItemCreateView(generics.CreateAPIView):
    serializer_class = CartItemSerializer
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        # cart, created = Cart.objects.get_or_create(user=self.request.user)
        # For testing purposes, retrieve user with ID 1
        user_instance = User.objects.get(id=self.request.user)
        cart, created = Cart.objects.get_or_create(user=user_instance)
        product_variant_id = self.request.data.get('product_variant_id')
        quantity = self.request.data.get('quantity', 1)

        try:
            product_variant = ProductsVariants.objects.get(id=product_variant_id)
        except ProductsVariants.DoesNotExist:
            return Response({"detail": "Product variant not found."}, status=status.HTTP_404_NOT_FOUND)

        cart_item, created = CartItem.objects.get_or_create(
            cart=cart,
            product_variant=product_variant,
            defaults={'quantity': quantity}
        )

        if not created:
            cart_item.quantity += int(quantity)
            cart_item.save()
        
        serializer.instance = cart_item

class CartItemUpdateView(generics.UpdateAPIView):
    http_method_names = ['patch']
    queryset = CartItem.objects.all()
    serializer_class = CartItemSerializer
    permission_classes = [IsAuthenticated]
    lookup_field = 'pk'

    def update(self, request, *args, **kwargs):
        cart_item = self.get_object()
        if cart_item.cart.user != request.user:
            return Response({"detail": "Not authorized to update this cart item."}, status=status.HTTP_403_FORBIDDEN)
        
        quantity = request.data.get('quantity')
        if quantity is not None:
            cart_item.quantity = quantity
            cart_item.save()
            serializer = self.get_serializer(cart_item)
            return Response(serializer.data)
        return Response({"detail": "Quantity not provided."}, status=status.HTTP_400_BAD_REQUEST)

class CartItemListViewUser(generics.ListAPIView):
    serializer_class = CartItemSerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        # For testing purposes, retrieve user with ID 1
        # user_instance = User.objects.get(id=1)
        user_instance = User.objects.get(pk=self.request.user.pk)
        # user_instance = self.request.user
        cart, created = Cart.objects.get_or_create(user=user_instance)
        return cart.items.all()



class CartItemListView(generics.ListAPIView):
    queryset = CartItem.objects.all()
    serializer_class = CartItemSerializer
    permission_classes = [IsAuthenticated] # Keep commented for now as per previous instructions
    pagination_class = CustomPageNumberPagination
    filter_backends = [OrderingFilter]
    ordering_fields = ['quantity', 'product_variant__product__name'] # Example fields for ordering
    ordering = ['id'] # Default ordering

class CartItemDeleteView(generics.DestroyAPIView):
    queryset = CartItem.objects.all()
    permission_classes = [IsAuthenticated]
    lookup_field = 'pk'

    def destroy(self, request, *args, **kwargs):
        cart_item = self.get_object()
        if cart_item.cart.user != request.user:
            return Response({"detail": "Not authorized to delete this cart item."}, status=status.HTTP_403_FORBIDDEN)
        
        self.perform_destroy(cart_item)
        return Response(status=status.HTTP_204_NO_CONTENT)