from rest_framework import generics, status, permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.pagination import PageNumberPagination
from django.db.models import Q, Count, Case, When, IntegerField, Exists, OuterRef, Value
from django.utils import timezone
from .models import Menu, MenuCategory, MenuItem, MenuItemVariant, MenuLike, MenuSave
from .serializers import (
    MenuSerializer, MenuListSerializer, MenuCreateSerializer, MenuUpdateSerializer,
    MenuCategorySerializer, MenuCategoryCreateSerializer,
    MenuItemSerializer, MenuItemCreateSerializer,
    MenuItemVariantSerializer,
)
import json
import io


class IsVendor(permissions.BasePermission):
    def has_permission(self, request, view):
        return (
            request.user.is_authenticated and
            request.user.user_type == 'vendor' and
            hasattr(request.user, 'vendor_profile')
        )


class IsAdmin(permissions.BasePermission):
    def has_permission(self, request, view):
        return (
            request.user.is_authenticated and
            request.user.user_type == 'admin'
        )


class MenuPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 50


# ============== PUBLIC ==============

class MenuListView(generics.ListAPIView):
    """List all active menus (public)"""
    serializer_class = MenuListSerializer
    permission_classes = [permissions.AllowAny]
    pagination_class = MenuPagination

    def get_queryset(self):
        queryset = Menu.objects.filter(status='active').select_related(
            'vendor', 'vendor__user'
        ).prefetch_related('categories', 'categories__items')

        # Filter by vendor
        vendor = self.request.query_params.get('vendor')
        if vendor:
            queryset = queryset.filter(vendor_id=vendor)

        vendor_slug = self.request.query_params.get('vendor_slug')
        if vendor_slug:
            queryset = queryset.filter(vendor__slug=vendor_slug)

        # Filter by menu type
        menu_type = self.request.query_params.get('menu_type')
        if menu_type:
            queryset = queryset.filter(menu_type=menu_type)

        # Search
        search = self.request.query_params.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(description__icontains=search) |
                Q(vendor__shop_name__icontains=search)
            )

        # Filter by county
        county = self.request.query_params.get('county')
        if county:
            queryset = queryset.filter(vendor__user__county__iexact=county)

        # Priority annotation: sponsored > verified > pro > default
        from promotions.utils import annotate_priority
        queryset = annotate_priority(queryset, 'menu')

        # Sort
        sort = self.request.query_params.get('sort')
        if sort == 'popular':
            queryset = queryset.annotate(total_likes=Count('likes')).order_by('-priority', '-total_likes')
        elif sort == 'views':
            queryset = queryset.order_by('-priority', '-views')
        else:
            queryset = queryset.order_by('-priority', '-created_at')

        return queryset.distinct()


class MenuDetailView(APIView):
    """Get menu detail by slug (public)"""
    permission_classes = [permissions.AllowAny]

    def get(self, request, slug):
        try:
            menu = Menu.objects.select_related(
                'vendor', 'vendor__user'
            ).prefetch_related(
                'categories', 'categories__items', 'categories__items__variants'
            ).get(slug=slug, status='active')
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        # Track view
        source = request.query_params.get('source')
        if source == 'qr':
            menu.qr_scans += 1
        menu.views += 1
        menu.save(update_fields=['views', 'qr_scans'])

        serializer = MenuSerializer(menu, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)


class MenuTrackViewView(APIView):
    """Track menu view (separate endpoint for POST tracking)"""
    permission_classes = [permissions.AllowAny]

    def post(self, request, slug):
        try:
            menu = Menu.objects.get(slug=slug, status='active')
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        source = request.data.get('source')
        if source == 'qr':
            menu.qr_scans += 1
        menu.views += 1
        menu.save(update_fields=['views', 'qr_scans'])

        return Response({'success': True, 'message': 'View tracked'}, status=status.HTTP_200_OK)


class MenuDetailByIdView(APIView):
    """Get menu detail by ID (public)"""
    permission_classes = [permissions.AllowAny]

    def get(self, request, pk):
        try:
            menu = Menu.objects.select_related(
                'vendor', 'vendor__user'
            ).prefetch_related(
                'categories', 'categories__items', 'categories__items__variants'
            ).get(pk=pk, status='active')
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        menu.views += 1
        menu.save(update_fields=['views'])

        serializer = MenuSerializer(menu, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)


class VendorMenusPublicView(generics.ListAPIView):
    """List menus by a specific vendor (public)"""
    serializer_class = MenuListSerializer
    permission_classes = [permissions.AllowAny]
    pagination_class = MenuPagination

    def get_queryset(self):
        vendor_slug = self.kwargs.get('vendor_slug')
        return Menu.objects.filter(
            vendor__slug=vendor_slug,
            status='active'
        ).select_related('vendor', 'vendor__user').prefetch_related('categories')


class MenuTypesView(APIView):
    """Get menu types with counts"""
    permission_classes = [permissions.AllowAny]

    def get(self, request):
        types = Menu.objects.filter(status='active').values('menu_type').annotate(
            count=Count('id')
        ).order_by('-count')

        type_labels = dict(Menu.MENU_TYPE_CHOICES)
        data = [
            {
                'key': t['menu_type'],
                'label': type_labels.get(t['menu_type'], t['menu_type']),
                'count': t['count'],
            }
            for t in types
        ]
        return Response({'success': True, 'data': data})


class PopularMenusView(APIView):
    """Get popular menus by likes/views"""
    permission_classes = [permissions.AllowAny]

    def get(self, request):
        limit = int(request.query_params.get('limit', 10))
        menus = Menu.objects.filter(status='active').annotate(
            total_likes=Count('likes')
        ).order_by('-total_likes', '-views').select_related(
            'vendor', 'vendor__user'
        ).prefetch_related('categories')[:limit]

        serializer = MenuListSerializer(menus, many=True, context={'request': request})
        return Response({'success': True, 'data': serializer.data})


# ============== VENDOR MANAGEMENT ==============

class VendorMyMenusView(APIView):
    """List vendor's own menus"""
    permission_classes = [IsVendor]

    def get(self, request):
        menus = Menu.objects.filter(
            vendor=request.user.vendor_profile
        ).exclude(status='deleted').select_related(
            'vendor', 'vendor__user'
        ).prefetch_related('categories', 'categories__items')

        serializer = MenuListSerializer(menus, many=True, context={'request': request})
        return Response({'success': True, 'data': serializer.data}, status=status.HTTP_200_OK)


class MenuCreateView(generics.CreateAPIView):
    """Create a new menu"""
    serializer_class = MenuCreateSerializer
    permission_classes = [IsVendor]
    parser_classes = [MultiPartParser, FormParser]

    def create(self, request, *args, **kwargs):
        data = request.data.copy()

        # Parse JSON fields
        if 'categories' in data and isinstance(data['categories'], str):
            try:
                data['categories_json'] = data['categories']
            except json.JSONDecodeError:
                data['categories_json'] = '[]'

        # Convert boolean fields
        if 'show_prices' in data:
            data['show_prices'] = str(data['show_prices']).lower() in ('true', '1', 'yes')

        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        menu = serializer.save()
        output = MenuSerializer(menu, context={'request': request})
        return Response({'success': True, 'data': output.data}, status=status.HTTP_201_CREATED)


class MenuUpdateView(APIView):
    """Update a menu"""
    permission_classes = [IsVendor]
    parser_classes = [MultiPartParser, FormParser]

    def put(self, request, pk):
        try:
            menu = Menu.objects.get(pk=pk, vendor=request.user.vendor_profile)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        data = request.data.copy()

        # Convert boolean fields
        if 'show_prices' in data:
            data['show_prices'] = str(data['show_prices']).lower() in ('true', '1', 'yes')

        serializer = MenuUpdateSerializer(menu, data=data, partial=True, context={'request': request})
        serializer.is_valid(raise_exception=True)
        menu = serializer.save()
        output = MenuSerializer(menu, context={'request': request})
        return Response({'success': True, 'data': output.data}, status=status.HTTP_200_OK)

    def patch(self, request, pk):
        return self.put(request, pk)


class MenuDeleteView(APIView):
    """Soft delete a menu"""
    permission_classes = [IsVendor]

    def delete(self, request, pk):
        try:
            menu = Menu.objects.get(pk=pk, vendor=request.user.vendor_profile)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        menu.status = 'deleted'
        menu.save(update_fields=['status'])

        # Update vendor menu count
        vendor_profile = request.user.vendor_profile
        vendor_profile.total_menus = max(0, vendor_profile.total_menus - 1)
        vendor_profile.save(update_fields=['total_menus'])

        return Response({'success': True, 'message': 'Menu deleted'}, status=status.HTTP_200_OK)


# ============== CATEGORY MANAGEMENT ==============

class MenuCategoryCreateView(APIView):
    """Create a category for a menu"""
    permission_classes = [IsVendor]
    parser_classes = [MultiPartParser, FormParser]

    def post(self, request, menu_id):
        try:
            menu = Menu.objects.get(pk=menu_id, vendor=request.user.vendor_profile)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        data = request.data.copy()
        serializer = MenuCategoryCreateSerializer(data=data)
        serializer.is_valid(raise_exception=True)

        validated_data = serializer.validated_data
        items_data = validated_data.pop('items', [])

        category = MenuCategory.objects.create(
            menu=menu,
            **validated_data
        )

        # Create items if provided
        for item_data in items_data:
            MenuItem.objects.create(
                category=category,
                name=item_data.get('name'),
                description=item_data.get('description', ''),
                price=item_data.get('price'),
                price_type=item_data.get('price_type', 'fixed'),
                display_order=item_data.get('display_order', 0),
            )

        return Response({
            'success': True,
            'data': MenuCategorySerializer(category).data
        }, status=status.HTTP_201_CREATED)


class MenuCategoryUpdateView(APIView):
    """Update a category"""
    permission_classes = [IsVendor]
    parser_classes = [MultiPartParser, FormParser]

    def put(self, request, pk):
        try:
            category = MenuCategory.objects.select_related('menu__vendor').get(
                pk=pk,
                menu__vendor=request.user.vendor_profile
            )
        except MenuCategory.DoesNotExist:
            return Response({'success': False, 'message': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)

        data = request.data.copy()

        # Update fields
        if 'name' in data:
            category.name = data['name']
        if 'description' in data:
            category.description = data['description']
        if 'display_order' in data:
            category.display_order = int(data['display_order'])
        if 'is_active' in data:
            category.is_active = str(data['is_active']).lower() in ('true', '1', 'yes')
        if 'image' in data and data['image']:
            category.image = data['image']

        category.save()

        return Response({
            'success': True,
            'data': MenuCategorySerializer(category).data
        }, status=status.HTTP_200_OK)

    def patch(self, request, pk):
        return self.put(request, pk)


class MenuCategoryDeleteView(APIView):
    """Delete a category"""
    permission_classes = [IsVendor]

    def delete(self, request, pk):
        try:
            category = MenuCategory.objects.select_related('menu__vendor').get(
                pk=pk,
                menu__vendor=request.user.vendor_profile
            )
        except MenuCategory.DoesNotExist:
            return Response({'success': False, 'message': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)

        category.delete()
        return Response({'success': True, 'message': 'Category deleted'}, status=status.HTTP_200_OK)


class MenuCategoryReorderView(APIView):
    """Reorder categories"""
    permission_classes = [IsVendor]

    def post(self, request, menu_id):
        try:
            menu = Menu.objects.get(pk=menu_id, vendor=request.user.vendor_profile)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        order = request.data.get('order', [])  # List of category IDs in new order
        for index, cat_id in enumerate(order):
            MenuCategory.objects.filter(id=cat_id, menu=menu).update(display_order=index)

        return Response({'success': True, 'message': 'Categories reordered'}, status=status.HTTP_200_OK)


# ============== ITEM MANAGEMENT ==============

class MenuItemCreateView(APIView):
    """Create an item for a category"""
    permission_classes = [IsVendor]
    parser_classes = [MultiPartParser, FormParser]

    def post(self, request, category_id):
        try:
            category = MenuCategory.objects.select_related('menu__vendor').get(
                pk=category_id,
                menu__vendor=request.user.vendor_profile
            )
        except MenuCategory.DoesNotExist:
            return Response({'success': False, 'message': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)

        vendor_profile = request.user.vendor_profile
        menu = category.menu

        # Check item limit for free vendors
        if not vendor_profile.is_upgraded:
            current_items = MenuItem.objects.filter(category__menu=menu).count()
            if current_items >= vendor_profile.max_items_per_menu:
                return Response({
                    'success': False,
                    'message': f'Free vendors can only have {vendor_profile.max_items_per_menu} items per menu. Please upgrade.'
                }, status=status.HTTP_400_BAD_REQUEST)

        data = request.data.copy()

        # Check image upload permission
        if not vendor_profile.is_upgraded and data.get('image'):
            return Response({
                'success': False,
                'message': 'Item images are only available for premium vendors.'
            }, status=status.HTTP_400_BAD_REQUEST)

        item = MenuItem.objects.create(
            category=category,
            name=data.get('name'),
            description=data.get('description', ''),
            price=data.get('price') if data.get('price') else None,
            price_type=data.get('price_type', 'fixed'),
            image=data.get('image') if vendor_profile.is_upgraded else None,
            display_order=int(data.get('display_order', 0)),
            is_available=str(data.get('is_available', 'true')).lower() in ('true', '1', 'yes'),
            is_popular=str(data.get('is_popular', 'false')).lower() in ('true', '1', 'yes'),
            is_new=str(data.get('is_new', 'false')).lower() in ('true', '1', 'yes'),
            is_spicy=str(data.get('is_spicy', 'false')).lower() in ('true', '1', 'yes'),
            is_vegetarian=str(data.get('is_vegetarian', 'false')).lower() in ('true', '1', 'yes'),
        )

        # Create variants if premium
        if vendor_profile.is_upgraded:
            variants_json = data.get('variants_json', '[]')
            try:
                variants = json.loads(variants_json) if isinstance(variants_json, str) else variants_json
            except json.JSONDecodeError:
                variants = []

            for var_data in variants:
                MenuItemVariant.objects.create(
                    item=item,
                    group_name=var_data.get('group_name'),
                    option_name=var_data.get('option_name'),
                    price_adjustment=var_data.get('price_adjustment', 0),
                    display_order=var_data.get('display_order', 0),
                )

        return Response({
            'success': True,
            'data': MenuItemSerializer(item).data
        }, status=status.HTTP_201_CREATED)


class MenuItemUpdateView(APIView):
    """Update an item"""
    permission_classes = [IsVendor]
    parser_classes = [MultiPartParser, FormParser]

    def put(self, request, pk):
        try:
            item = MenuItem.objects.select_related('category__menu__vendor').get(
                pk=pk,
                category__menu__vendor=request.user.vendor_profile
            )
        except MenuItem.DoesNotExist:
            return Response({'success': False, 'message': 'Item not found'}, status=status.HTTP_404_NOT_FOUND)

        vendor_profile = request.user.vendor_profile
        data = request.data.copy()

        # Update fields
        if 'name' in data:
            item.name = data['name']
        if 'description' in data:
            item.description = data['description']
        if 'price' in data:
            item.price = data['price'] if data['price'] else None
        if 'price_type' in data:
            item.price_type = data['price_type']
        if 'display_order' in data:
            item.display_order = int(data['display_order'])
        if 'is_available' in data:
            item.is_available = str(data['is_available']).lower() in ('true', '1', 'yes')
        if 'is_popular' in data:
            item.is_popular = str(data['is_popular']).lower() in ('true', '1', 'yes')
        if 'is_new' in data:
            item.is_new = str(data['is_new']).lower() in ('true', '1', 'yes')
        if 'is_spicy' in data:
            item.is_spicy = str(data['is_spicy']).lower() in ('true', '1', 'yes')
        if 'is_vegetarian' in data:
            item.is_vegetarian = str(data['is_vegetarian']).lower() in ('true', '1', 'yes')

        # Handle image (premium only)
        if 'image' in data and data['image']:
            if vendor_profile.is_upgraded:
                item.image = data['image']

        item.save()

        # Update variants if premium
        if vendor_profile.is_upgraded and 'variants_json' in data:
            variants_json = data.get('variants_json', '[]')
            try:
                variants = json.loads(variants_json) if isinstance(variants_json, str) else variants_json
            except json.JSONDecodeError:
                variants = []

            # Delete existing and recreate
            item.variants.all().delete()
            for var_data in variants:
                MenuItemVariant.objects.create(
                    item=item,
                    group_name=var_data.get('group_name'),
                    option_name=var_data.get('option_name'),
                    price_adjustment=var_data.get('price_adjustment', 0),
                    display_order=var_data.get('display_order', 0),
                )

        return Response({
            'success': True,
            'data': MenuItemSerializer(item).data
        }, status=status.HTTP_200_OK)

    def patch(self, request, pk):
        return self.put(request, pk)


class MenuItemDeleteView(APIView):
    """Delete an item"""
    permission_classes = [IsVendor]

    def delete(self, request, pk):
        try:
            item = MenuItem.objects.select_related('category__menu__vendor').get(
                pk=pk,
                category__menu__vendor=request.user.vendor_profile
            )
        except MenuItem.DoesNotExist:
            return Response({'success': False, 'message': 'Item not found'}, status=status.HTTP_404_NOT_FOUND)

        item.delete()
        return Response({'success': True, 'message': 'Item deleted'}, status=status.HTTP_200_OK)


class MenuItemToggleAvailabilityView(APIView):
    """Toggle item availability"""
    permission_classes = [IsVendor]

    def post(self, request, pk):
        try:
            item = MenuItem.objects.select_related('category__menu__vendor').get(
                pk=pk,
                category__menu__vendor=request.user.vendor_profile
            )
        except MenuItem.DoesNotExist:
            return Response({'success': False, 'message': 'Item not found'}, status=status.HTTP_404_NOT_FOUND)

        item.is_available = not item.is_available
        item.save(update_fields=['is_available'])

        return Response({
            'success': True,
            'is_available': item.is_available,
            'message': f'Item is now {"available" if item.is_available else "unavailable"}'
        }, status=status.HTTP_200_OK)


class MenuItemReorderView(APIView):
    """Reorder items within a category"""
    permission_classes = [IsVendor]

    def post(self, request, category_id):
        try:
            category = MenuCategory.objects.select_related('menu__vendor').get(
                pk=category_id,
                menu__vendor=request.user.vendor_profile
            )
        except MenuCategory.DoesNotExist:
            return Response({'success': False, 'message': 'Category not found'}, status=status.HTTP_404_NOT_FOUND)

        order = request.data.get('order', [])  # List of item IDs in new order
        for index, item_id in enumerate(order):
            MenuItem.objects.filter(id=item_id, category=category).update(display_order=index)

        return Response({'success': True, 'message': 'Items reordered'}, status=status.HTTP_200_OK)


# ============== QR CODE ==============

class MenuQRGenerateView(APIView):
    """Generate QR code for a menu"""
    permission_classes = [IsVendor]

    def post(self, request, pk):
        try:
            menu = Menu.objects.get(pk=pk, vendor=request.user.vendor_profile)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        vendor_profile = request.user.vendor_profile

        # Get customization options
        style = request.data.get('style', 'classic')  # classic, rounded, dots
        fg_color = request.data.get('fg_color', '#000000')
        bg_color = request.data.get('bg_color', '#FFFFFF')
        include_logo = request.data.get('include_logo', False) and vendor_profile.is_upgraded

        # Premium check for styles
        if style != 'classic' and not vendor_profile.is_upgraded:
            style = 'classic'

        try:
            import qrcode
            from qrcode.image.styledpil import StyledPilImage
            from qrcode.image.styles.moduledrawers import (
                SquareModuleDrawer, RoundedModuleDrawer, CircleModuleDrawer
            )
            from PIL import Image
            import base64

            # Build menu URL
            from django.conf import settings
            frontend_url = getattr(settings, 'FRONTEND_URL', 'https://wananchimart.com')
            menu_url = f"{frontend_url}/menu/{menu.slug}?source=qr"

            # Create QR code
            qr = qrcode.QRCode(
                version=1,
                error_correction=qrcode.constants.ERROR_CORRECT_H if include_logo else qrcode.constants.ERROR_CORRECT_M,
                box_size=10,
                border=4,
            )
            qr.add_data(menu_url)
            qr.make(fit=True)

            # Choose drawer style
            if style == 'rounded':
                drawer = RoundedModuleDrawer()
            elif style == 'dots':
                drawer = CircleModuleDrawer()
            else:
                drawer = SquareModuleDrawer()

            # Generate image
            img = qr.make_image(
                image_factory=StyledPilImage,
                module_drawer=drawer,
                fill_color=fg_color,
                back_color=bg_color
            )

            # Add logo if requested and premium
            if include_logo and menu.logo:
                logo = Image.open(menu.logo.path)
                logo_size = img.size[0] // 4
                logo = logo.resize((logo_size, logo_size), Image.Resampling.LANCZOS)

                # Create white background for logo
                logo_bg = Image.new('RGBA', (logo_size + 10, logo_size + 10), 'white')
                pos = ((img.size[0] - logo_size) // 2, (img.size[1] - logo_size) // 2)
                bg_pos = (pos[0] - 5, pos[1] - 5)

                img = img.convert('RGBA')
                img.paste(logo_bg, bg_pos)
                img.paste(logo, pos, logo if logo.mode == 'RGBA' else None)

            # Convert to base64
            buffer = io.BytesIO()
            img.save(buffer, format='PNG')
            buffer.seek(0)
            img_base64 = base64.b64encode(buffer.getvalue()).decode()

            return Response({
                'success': True,
                'data': {
                    'qr_code': f'data:image/png;base64,{img_base64}',
                    'menu_url': menu_url,
                }
            }, status=status.HTTP_200_OK)

        except ImportError:
            return Response({
                'success': False,
                'message': 'QR code generation not available. Please contact support.'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


class MenuQRDownloadView(APIView):
    """Download QR code in different formats"""
    permission_classes = [IsVendor]

    def get(self, request, pk, format_type):
        try:
            menu = Menu.objects.get(pk=pk, vendor=request.user.vendor_profile)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        vendor_profile = request.user.vendor_profile

        # Get customization from query params
        style = request.query_params.get('style', 'classic')
        fg_color = request.query_params.get('fg_color', '#000000')
        bg_color = request.query_params.get('bg_color', '#FFFFFF')
        include_logo = request.query_params.get('include_logo', 'false').lower() == 'true' and vendor_profile.is_upgraded

        if style != 'classic' and not vendor_profile.is_upgraded:
            style = 'classic'

        try:
            import qrcode
            from qrcode.image.styledpil import StyledPilImage
            from qrcode.image.styles.moduledrawers import (
                SquareModuleDrawer, RoundedModuleDrawer, CircleModuleDrawer
            )
            from PIL import Image
            from django.http import HttpResponse

            from django.conf import settings
            frontend_url = getattr(settings, 'FRONTEND_URL', 'https://wananchimart.com')
            menu_url = f"{frontend_url}/menu/{menu.slug}?source=qr"

            qr = qrcode.QRCode(
                version=1,
                error_correction=qrcode.constants.ERROR_CORRECT_H if include_logo else qrcode.constants.ERROR_CORRECT_M,
                box_size=10,
                border=4,
            )
            qr.add_data(menu_url)
            qr.make(fit=True)

            if style == 'rounded':
                drawer = RoundedModuleDrawer()
            elif style == 'dots':
                drawer = CircleModuleDrawer()
            else:
                drawer = SquareModuleDrawer()

            img = qr.make_image(
                image_factory=StyledPilImage,
                module_drawer=drawer,
                fill_color=fg_color,
                back_color=bg_color
            )

            if include_logo and menu.logo:
                logo = Image.open(menu.logo.path)
                logo_size = img.size[0] // 4
                logo = logo.resize((logo_size, logo_size), Image.Resampling.LANCZOS)
                logo_bg = Image.new('RGBA', (logo_size + 10, logo_size + 10), 'white')
                pos = ((img.size[0] - logo_size) // 2, (img.size[1] - logo_size) // 2)
                bg_pos = (pos[0] - 5, pos[1] - 5)
                img = img.convert('RGBA')
                img.paste(logo_bg, bg_pos)
                img.paste(logo, pos, logo if logo.mode == 'RGBA' else None)

            buffer = io.BytesIO()

            if format_type == 'png':
                img.save(buffer, format='PNG')
                content_type = 'image/png'
                ext = 'png'
            elif format_type == 'jpg':
                if img.mode == 'RGBA':
                    img = img.convert('RGB')
                img.save(buffer, format='JPEG', quality=95)
                content_type = 'image/jpeg'
                ext = 'jpg'
            elif format_type == 'svg':
                # For SVG, regenerate with svg factory
                import qrcode.image.svg
                qr_svg = qrcode.QRCode(
                    version=1,
                    error_correction=qrcode.constants.ERROR_CORRECT_M,
                    box_size=10,
                    border=4,
                )
                qr_svg.add_data(menu_url)
                qr_svg.make(fit=True)
                img_svg = qr_svg.make_image(image_factory=qrcode.image.svg.SvgImage)
                img_svg.save(buffer)
                content_type = 'image/svg+xml'
                ext = 'svg'
            else:
                return Response({'success': False, 'message': 'Invalid format'}, status=status.HTTP_400_BAD_REQUEST)

            buffer.seek(0)
            response = HttpResponse(buffer.getvalue(), content_type=content_type)
            response['Content-Disposition'] = f'attachment; filename="{menu.slug}-qr.{ext}"'
            return response

        except ImportError:
            return Response({
                'success': False,
                'message': 'QR code generation not available.'
            }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


# ============== ANALYTICS ==============

class MenuAnalyticsView(APIView):
    """Get menu analytics"""
    permission_classes = [IsVendor]

    def get(self, request, pk):
        try:
            menu = Menu.objects.get(pk=pk, vendor=request.user.vendor_profile)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        # Get popular items
        popular_items = MenuItem.objects.filter(
            category__menu=menu
        ).order_by('-views')[:5]

        data = {
            'total_views': menu.views,
            'qr_scans': menu.qr_scans,
            'likes_count': menu.likes.count(),
            'saves_count': menu.saves.count(),
            'categories_count': menu.categories.filter(is_active=True).count(),
            'items_count': MenuItem.objects.filter(category__menu=menu).count(),
            'available_items': MenuItem.objects.filter(category__menu=menu, is_available=True).count(),
            'popular_items': MenuItemSerializer(popular_items, many=True).data,
        }

        return Response({'success': True, 'data': data}, status=status.HTTP_200_OK)


# ============== SOCIAL ==============

class MenuLikeToggleView(APIView):
    """Toggle like on a menu"""
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request, menu_id):
        try:
            menu = Menu.objects.get(id=menu_id, status='active')
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        like, created = MenuLike.objects.get_or_create(user=request.user, menu=menu)
        if not created:
            like.delete()
            return Response({'success': True, 'liked': False, 'likes_count': menu.likes.count()})
        return Response({'success': True, 'liked': True, 'likes_count': menu.likes.count()})


class MenuSaveToggleView(APIView):
    """Toggle save on a menu"""
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request, menu_id):
        try:
            menu = Menu.objects.get(id=menu_id, status='active')
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        save, created = MenuSave.objects.get_or_create(user=request.user, menu=menu)
        if not created:
            save.delete()
            return Response({'success': True, 'saved': False})
        return Response({'success': True, 'saved': True})


# ============== ADMIN ==============

class AdminMenusListView(APIView):
    """Admin: list all menus"""
    permission_classes = [IsAdmin]

    def get(self, request):
        queryset = Menu.objects.all().select_related('vendor', 'vendor__user').prefetch_related('categories')

        search = request.query_params.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(vendor__shop_name__icontains=search)
            )

        menu_type = request.query_params.get('menu_type')
        if menu_type:
            queryset = queryset.filter(menu_type=menu_type)

        status_filter = request.query_params.get('status')
        if status_filter:
            queryset = queryset.filter(status=status_filter)

        paginator = MenuPagination()
        page = paginator.paginate_queryset(queryset, request)
        if page is not None:
            serializer = MenuListSerializer(page, many=True, context={'request': request})
            paginated = paginator.get_paginated_response(serializer.data)
            return Response({
                'success': True,
                'data': paginated.data['results'],
                'count': paginated.data['count'],
                'next': paginated.data['next'],
                'previous': paginated.data['previous'],
            })
        serializer = MenuListSerializer(queryset, many=True, context={'request': request})
        return Response({'success': True, 'data': serializer.data})


class AdminMenuToggleView(APIView):
    """Admin: toggle menu status"""
    permission_classes = [IsAdmin]

    def post(self, request, pk):
        try:
            menu = Menu.objects.get(pk=pk)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        new_status = request.data.get('status', 'inactive' if menu.status == 'active' else 'active')
        menu.status = new_status
        menu.save(update_fields=['status'])
        return Response({'success': True, 'message': f'Menu status changed to {new_status}', 'status': new_status})


class AdminMenuDeleteView(APIView):
    """Admin: delete a menu"""
    permission_classes = [IsAdmin]

    def delete(self, request, pk):
        try:
            menu = Menu.objects.get(pk=pk)
        except Menu.DoesNotExist:
            return Response({'success': False, 'message': 'Menu not found'}, status=status.HTTP_404_NOT_FOUND)

        # Update vendor count
        vendor_profile = menu.vendor
        vendor_profile.total_menus = max(0, vendor_profile.total_menus - 1)
        vendor_profile.save(update_fields=['total_menus'])

        menu.status = 'deleted'
        menu.save(update_fields=['status'])

        return Response({'success': True, 'message': 'Menu deleted'})
