from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import action, api_view, permission_classes
from account.permissions import (
    HasTabPermission,
    user_can_see_all_shop_data,
    get_user_data_filter,
)
from rest_framework.response import Response
from django.db import models
from shop_management.views.data.base import DataRootViewSet
from shop_management.views.data.pagination import CustomPagination
from shop_management.serializers.data.product import (
    CategorySerializer, Category, Product, ProductSerializer,
    ProductPrice, ProductPriceSerializer,
)

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def export_all_products(request):
    """Export all products without pagination"""
    if user_can_see_all_shop_data(request.user, "products"):
        queryset = Product.objects.all().order_by('-id')
    else:
        queryset = Product.objects.filter(get_user_data_filter(request.user, "shop")).distinct().order_by('-id')
    
    # Apply filters
    search = request.query_params.get('search', '')
    category = request.query_params.get('category', '')
    
    if search:
        queryset = queryset.filter(
            models.Q(name__icontains=search) | 
            models.Q(description__icontains=search) |
            models.Q(code__icontains=search)
        )
    
    if category:
        queryset = queryset.filter(category=category)
    
    # Serialize without pagination
    serializer = ProductSerializer(queryset, many=True)
    return Response(serializer.data)

class CategoryViewSet(DataRootViewSet):
    serializer_class = CategorySerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "category"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['shop']
    search_fields = ['name']
    pagination_class = CustomPagination

    def get_queryset(self):
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            return Category.objects.all().order_by('-id')
        return Category.objects.filter(get_user_data_filter(self.request.user, "shop")).distinct().order_by('-id')



class ProductViewSet(DataRootViewSet):
    serializer_class = ProductSerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "products"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['shop', 'category']
    search_fields = ['name', 'description', 'code', 'barcode']
    pagination_class = CustomPagination

    def get_queryset(self):
        queryset = Product.objects.select_related(
            "shop", "category", "default_unit"
        ).prefetch_related("prices__currency")
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            return queryset.order_by('-id')
        return queryset.filter(get_user_data_filter(self.request.user, "shop")).distinct().order_by('-id')
    
    @action(detail=False, methods=['get'], pagination_class=None)
    def export_all(self, request):
        if user_can_see_all_shop_data(request.user, self.required_tab):
            queryset = Product.objects.all().order_by('-id')
        else:
            queryset = Product.objects.filter(get_user_data_filter(request.user, "shop")).distinct().order_by('-id')
        
        # Apply filters manually
        search = request.query_params.get('search', '')
        category = request.query_params.get('category', '')
        
        if search:
            queryset = queryset.filter(
                models.Q(name__icontains=search) | 
                models.Q(description__icontains=search) |
                models.Q(code__icontains=search)
            )
        
        if category:
            queryset = queryset.filter(category=category)
            
        # Serialize all data without pagination - force no pagination
        serializer = ProductSerializer(queryset, many=True)
        return Response(serializer.data)


class ProductPriceViewSet(DataRootViewSet):
    serializer_class = ProductPriceSerializer
    permission_classes = [IsAuthenticated, HasTabPermission]
    required_tab = "products"
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ["product", "currency", "price_type"]
    search_fields = ["product__name", "product__code", "currency__title"]
    pagination_class = CustomPagination

    def get_queryset(self):
        queryset = ProductPrice.objects.select_related("product", "currency", "product__shop")
        if user_can_see_all_shop_data(self.request.user, self.required_tab):
            return queryset
        return queryset.filter(
            get_user_data_filter(self.request.user, "product__shop")
        ).distinct()

    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)
