from django.db.models import Case, IntegerField, Q, Value, When
from rest_framework import generics
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import AyurvedaVendorListing, Booking, Category, Deal, NavigationItem, Page, SiteSettings, SupportRequest, TrustBenefit, WebsiteImage
from .serializers import AyurvedaVendorListingSerializer, BookingSerializer, CategorySerializer, DealSerializer, NavigationItemSerializer, PageSerializer, SiteSettingsSerializer, SupportRequestSerializer, TrustBenefitSerializer, WebsiteImageSerializer


@api_view(['GET'])
def health(request):
    return Response({'status': 'ok', 'service': 'ASNDeals API'})


class CategoryList(generics.ListAPIView):
    queryset = Category.objects.filter(active=True).annotate(_display_order=Case(
        When(slug='dental', then=Value(1)), When(slug='beauty', then=Value(2)),
        When(slug='ayurveda', then=Value(3)), When(slug='skincare', then=Value(4)),
        default=Value(99), output_field=IntegerField(),
    )).order_by('_display_order')
    serializer_class = CategorySerializer
    pagination_class = None


class DealList(generics.ListAPIView):
    serializer_class = DealSerializer

    def get_queryset(self):
        queryset = Deal.objects.filter(active=True).select_related('category')
        category = self.request.query_params.get('category')
        city = self.request.query_params.get('city')
        search = self.request.query_params.get('search')
        if category:
            queryset = queryset.filter(category__slug=category)
        if city:
            queryset = queryset.filter(city__iexact=city)
        if search:
            queryset = queryset.filter(Q(title__icontains=search) | Q(clinic__icontains=search) | Q(city__icontains=search))
        if self.request.query_params.get('featured') in ('true', '1'):
            queryset = queryset.filter(featured=True)
        return queryset


class DealDetail(generics.RetrieveAPIView):
    queryset = Deal.objects.filter(active=True).select_related('category')
    serializer_class = DealSerializer
    lookup_field = 'slug'


class BookingCreate(generics.CreateAPIView):
    queryset = Booking.objects.all()
    serializer_class = BookingSerializer


class SupportRequestCreate(generics.CreateAPIView):
    queryset = SupportRequest.objects.all()
    serializer_class = SupportRequestSerializer


class PageList(generics.ListAPIView):
    queryset = Page.objects.filter(published=True).prefetch_related('sections')
    serializer_class = PageSerializer
    pagination_class = None


class PageDetail(generics.RetrieveAPIView):
    queryset = Page.objects.filter(published=True).prefetch_related('sections')
    serializer_class = PageSerializer
    lookup_field = 'slug'


@api_view(['GET'])
def site_settings(request):
    settings = SiteSettings.objects.first()
    return Response(SiteSettingsSerializer(settings).data if settings else {})


@api_view(['GET'])
def homepage(request):
    context = {'request': request}
    settings = SiteSettings.objects.first()
    return Response({'settings': SiteSettingsSerializer(settings, context=context).data if settings else {}, 'categories': CategorySerializer(Category.objects.filter(active=True).order_by('sort_order', 'id'), many=True, context=context).data, 'deals': DealSerializer(Deal.objects.filter(active=True, featured=True).select_related('category'), many=True, context=context).data, 'benefits': TrustBenefitSerializer(TrustBenefit.objects.filter(active=True), many=True, context=context).data})


@api_view(['GET'])
def website_images(request):
    page = request.query_params.get('page', '').strip()
    images = WebsiteImage.objects.filter(active=True).filter(Q(page_path='') | Q(page_path=page))
    return Response(WebsiteImageSerializer(images, many=True, context={'request': request}).data)


class NavigationList(generics.ListAPIView):
    queryset = NavigationItem.objects.filter(active=True)
    serializer_class = NavigationItemSerializer
    pagination_class = None


class AyurvedaVendorListingListCreate(generics.ListCreateAPIView):
    serializer_class = AyurvedaVendorListingSerializer
    pagination_class = None

    def get_queryset(self):
        from django.db.models import Case, IntegerField, Value, When
        from django.utils import timezone
        today = timezone.localdate()
        queryset = AyurvedaVendorListing.objects.filter(status='approved')
        category = self.request.query_params.get('category')
        if category in dict(AyurvedaVendorListing.CATEGORY_CHOICES):
            queryset = queryset.filter(category=category)
        return queryset.annotate(
            sponsor_rank=Case(When(sponsored=True, sponsored_until__gte=today, then=Value(0)), When(sponsored=True, sponsored_until__isnull=True, then=Value(0)), default=Value(1), output_field=IntegerField())
        ).order_by('sponsor_rank', '-quality_rating', 'price', '-created_at')

# Create your views here.
