from rest_framework import generics, permissions
from rest_framework.parsers import MultiPartParser, FormParser
from django.db.models import Count
from .models import MenuItem
from .serializers import (
    MenuItemSerializer,
    MenuItemCreateSerializer
)
from menu.permissions import IsAdminOrManager


# 🔹 List all menu items (for customers)
class MenuItemListView(generics.ListAPIView):
    queryset = MenuItem.objects.filter(available=True).annotate(order_count=Count('orderitem'))
    serializer_class = MenuItemSerializer
    permission_classes = [permissions.AllowAny]


class MenuItemAdminListView(generics.ListAPIView):
    queryset = MenuItem.objects.all().annotate(order_count=Count('orderitem')).order_by("id")
    serializer_class = MenuItemSerializer
    permission_classes = [permissions.IsAuthenticated, IsAdminOrManager]


# 🔹 Retrieve single menu item
class MenuItemDetailView(generics.RetrieveAPIView):
    queryset = MenuItem.objects.all()
    serializer_class = MenuItemSerializer
    permission_classes = [permissions.AllowAny]


# 🔹 Create menu item (Admin & Manager only)
class MenuItemCreateView(generics.CreateAPIView):
    queryset = MenuItem.objects.all()
    serializer_class = MenuItemCreateSerializer
    permission_classes = [permissions.IsAuthenticated, IsAdminOrManager]
    parser_classes = [MultiPartParser, FormParser]


# 🔹 Update menu item (Admin & Manager only)
class MenuItemUpdateView(generics.UpdateAPIView):
    queryset = MenuItem.objects.all()
    serializer_class = MenuItemCreateSerializer
    permission_classes = [permissions.IsAuthenticated, IsAdminOrManager]
    parser_classes = [MultiPartParser, FormParser]


# 🔹 Delete menu item (Admin & Manager only)
class MenuItemDeleteView(generics.DestroyAPIView):
    queryset = MenuItem.objects.all()
    permission_classes = [permissions.IsAuthenticated, IsAdminOrManager]
    
from .models import Category
from .serializers import CategorySerializer
from menu.permissions import IsAdminOrManager
from rest_framework import generics, permissions


# 🔹 List Categories (Public)
class CategoryListView(generics.ListAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [permissions.AllowAny]


# 🔹 Retrieve Category
class CategoryDetailView(generics.RetrieveAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [permissions.AllowAny]


# 🔹 Create Category (Admin & Manager)
class CategoryCreateView(generics.CreateAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [permissions.IsAuthenticated, IsAdminOrManager]


# 🔹 Update Category (Admin & Manager)
class CategoryUpdateView(generics.UpdateAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [permissions.IsAuthenticated, IsAdminOrManager]


# 🔹 Delete Category (Admin & Manager)
class CategoryDeleteView(generics.DestroyAPIView):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [permissions.IsAuthenticated, IsAdminOrManager]
