from django.db.models import Q
from django.http import JsonResponse
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response

from apps.content.models import Banner
from apps.content.serializers import BannerSerializer
from apps.events.models import Event
from apps.events.serializers import EventListSerializer
from apps.products.models import Product
from apps.products.serializers import ProductSerializer
from apps.stores.models import Category, Store
from apps.stores.serializers import CategorySerializer, StoreListSerializer


def health_check(request):
    """Health check endpoint."""
    return JsonResponse({"status": "ok", "service": "rfoof"})


class HomeViewSet(viewsets.ViewSet):
    """ViewSet for home feed endpoints."""

    def get_permissions(self):
        if self.action == "guest":
            return [AllowAny()]
        return [IsAuthenticated()]

    @action(detail=False, methods=["get"], url_path="guest")
    def guest(self, request):
        """GET /home/guest/ — home feed for guest users."""
        banners = Banner.objects.filter(is_active=True, placement="home_top").order_by("order")[:5]
        categories = Category.objects.all()
        top_stores = Store.objects.filter(is_top=True)[:10]
        recommended_stores = Store.objects.filter(is_recommended=True)[:10]
        recently_added = Store.objects.filter(is_recently_added=True)[:10]
        events = Event.objects.all().order_by("-start_date")[:5]
        great_offers = Product.objects.filter(discount_percent__gt=0).order_by(
            "-discount_percent"
        )[:10]

        return Response(
            {
                "banners": BannerSerializer(banners, many=True).data,
                "categories": CategorySerializer(categories, many=True).data,
                "top_stores": StoreListSerializer(top_stores, many=True).data,
                "recommended_stores": StoreListSerializer(recommended_stores, many=True).data,
                "recently_added": StoreListSerializer(recently_added, many=True).data,
                "events": EventListSerializer(events, many=True).data,
                "great_offers": ProductSerializer(great_offers, many=True).data,
            }
        )

    def list(self, request):
        """GET /home/ — home feed for authenticated users."""
        banners = Banner.objects.filter(is_active=True, placement="home_top").order_by("order")[:5]
        categories = Category.objects.all()
        top_stores = Store.objects.filter(is_top=True)[:10]
        recommended_stores = Store.objects.filter(is_recommended=True)[:10]
        recently_added = Store.objects.filter(is_recently_added=True)[:10]
        events = Event.objects.all().order_by("-start_date")[:5]
        great_offers = Product.objects.filter(discount_percent__gt=0).order_by(
            "-discount_percent"
        )[:10]
        promotions = Banner.objects.filter(is_active=True).exclude(placement="home_top").order_by(
            "order"
        )[:5]

        return Response(
            {
                "banners": BannerSerializer(banners, many=True).data,
                "categories": CategorySerializer(categories, many=True).data,
                "top_stores": StoreListSerializer(top_stores, many=True).data,
                "recommended_stores": StoreListSerializer(recommended_stores, many=True).data,
                "recently_added": StoreListSerializer(recently_added, many=True).data,
                "events": EventListSerializer(events, many=True).data,
                "great_offers": ProductSerializer(great_offers, many=True).data,
                "promotions": BannerSerializer(promotions, many=True).data,
            }
        )


class SearchViewSet(viewsets.ViewSet):
    """ViewSet for global search."""

    permission_classes = [AllowAny]

    def list(self, request):
        """GET /search/?q=... — search stores, products, events."""
        q = request.query_params.get("q", "").strip()
        if not q:
            return Response({"stores": [], "products": [], "events": []})

        stores = Store.objects.filter(
            Q(name_en__icontains=q) | Q(name_ar__icontains=q)
        )[:10]
        products = Product.objects.filter(
            Q(name_en__icontains=q) | Q(name_ar__icontains=q)
        )[:10]
        events = Event.objects.filter(
            Q(name_en__icontains=q) | Q(name_ar__icontains=q)
        )[:10]

        return Response(
            {
                "stores": StoreListSerializer(stores, many=True).data,
                "products": ProductSerializer(products, many=True).data,
                "events": EventListSerializer(events, many=True).data,
            }
        )
