from rest_framework import viewsets, permissions, status
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import Product, ProductImage
from .serializers import ProductImageSerializer, ProductSerializer

class ProductAdminViewSet(viewsets.ModelViewSet):
    serializer_class = ProductSerializer
    permission_classes = [permissions.IsAdminUser]

    def get_queryset(self):
        qs = Product.objects.all().prefetch_related('images')
        category = self.request.query_params.get('category')
        if category:
            qs = qs.filter(category=category)
        opportunity_bundle = self.request.query_params.get('opportunity_bundle')
        if opportunity_bundle:
            qs = qs.filter(opportunity_bundle_id=opportunity_bundle)
        return qs

    @action(detail=True, methods=['get', 'post'], url_path='images')
    def images(self, request, pk=None):
        product = self.get_object()

        if request.method.lower() == 'get':
            queryset = product.images.all().order_by('sort_order', 'created_at')
            serializer = ProductImageSerializer(queryset, many=True, context={'request': request})
            return Response(serializer.data, status=status.HTTP_200_OK)

        image = request.FILES.get('image')
        if not image:
            return Response({'detail': 'image file is required'}, status=status.HTTP_400_BAD_REQUEST)

        is_primary = str(request.data.get('is_primary', 'false')).lower() in {'1', 'true', 'yes'}
        alt_text = request.data.get('alt_text', '')

        sort_order_raw = request.data.get('sort_order')
        try:
            sort_order = int(sort_order_raw) if sort_order_raw is not None and str(sort_order_raw) != '' else product.images.count()
        except Exception:
            sort_order = product.images.count()

        obj = ProductImage.objects.create(
            product=product,
            image=image,
            alt_text=alt_text,
            is_primary=is_primary,
            sort_order=max(0, sort_order),
        )
        serializer = ProductImageSerializer(obj, context={'request': request})
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    @action(detail=True, methods=['post'], url_path=r'images/(?P<image_id>[^/.]+)/set-primary')
    def set_primary_image(self, request, pk=None, image_id=None):
        product = self.get_object()
        image = product.images.filter(id=image_id).first()
        if not image:
            return Response({'detail': 'Image not found'}, status=status.HTTP_404_NOT_FOUND)

        image.is_primary = True
        image.save(update_fields=['is_primary', 'updated_at'])
        return Response({'success': True}, status=status.HTTP_200_OK)

    @action(detail=True, methods=['delete'], url_path=r'images/(?P<image_id>[^/.]+)')
    def delete_image(self, request, pk=None, image_id=None):
        product = self.get_object()
        image = product.images.filter(id=image_id).first()
        if not image:
            return Response({'detail': 'Image not found'}, status=status.HTTP_404_NOT_FOUND)

        was_primary = image.is_primary
        image.delete()

        if was_primary:
            next_image = product.images.first()
            if next_image:
                next_image.is_primary = True
                next_image.save(update_fields=['is_primary', 'updated_at'])

        return Response(status=status.HTTP_204_NO_CONTENT)

class ProductPublicViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Product.objects.filter(is_active=True).prefetch_related('images')
    serializer_class = ProductSerializer
    permission_classes = [permissions.AllowAny]

    def get_queryset(self):
        qs = super().get_queryset()
        category = self.request.query_params.get('category')
        if category:
            qs = qs.filter(category=category)
        opportunity_bundle = self.request.query_params.get('opportunity_bundle')
        if opportunity_bundle:
            qs = qs.filter(opportunity_bundle_id=opportunity_bundle)
        return qs
