from django.db.models import Q
from django.shortcuts import get_object_or_404

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import generics
from rest_framework.permissions import IsAuthenticated

from blog.models import BlogPost
from blog.permissions import (IsBlogAdmin,)

from .models import AdBanner

from .serializers import (
    BannerListSerializer,
    BannerWriteSerializer,
)






@api_view(["GET"])
def get_blog_banners(request, slug):
    """
    Returns banners applicable to a blog post.

    Banner priority:
    1. Post-specific banners
    2. Category-specific banners
    3. Global banners
    """

    blog = get_object_or_404(
        BlogPost.objects.select_related("category"),
        slug=slug
    )

    placement = request.GET.get("placement")

    banners = AdBanner.objects.filter(
        is_active=True
    ).filter(
        # Specific blog banner
        Q(blog=blog)

        # Category banner
        | Q(
            blog__isnull=True,
            category=blog.category
        )

        # Global banner
        | Q(
            blog__isnull=True,
            category__isnull=True
        )
    )

    if placement:
        banners = banners.filter(placement=placement)

    banners = banners.order_by("-priority", "-created_at")

    data = []

    for b in banners:
        try:
            data.append({
                "id": b.id,
                "title": b.title,
                "message": b.message,
                "cta_url": b.cta_url,
                "cta_text": b.cta_text,
                "image": (
                    request.build_absolute_uri(b.image.url)
                    if b.image
                    else None
                ),
                "blog_id": b.blog.id if b.blog else None,
            })
        except Exception as e:
            continue

    return Response(data)







class AdminBannerListCreateView(
    generics.ListCreateAPIView
):

    permission_classes = [
        IsAuthenticated,
        IsBlogAdmin,
    ]

    queryset = (
        AdBanner.objects
        .select_related(
            "category",
            "blog",
        )
        .order_by("-created_at")
    )

    def get_queryset(self):

        queryset = AdBanner.objects.select_related(
            "category",
            "blog",
        ).order_by("-created_at")

        search = self.request.query_params.get(
            "search",
            "",
        )

        if search:

            queryset = queryset.filter(
                title__icontains=search
            )

        return queryset

    def get_serializer_class(self):

        if self.request.method == "GET":
            return BannerListSerializer

        return BannerWriteSerializer
    

class AdminBannerDetailView(generics.RetrieveUpdateDestroyAPIView):

    permission_classes = [
        IsAuthenticated,
        IsBlogAdmin,
    ]

    queryset = (
        AdBanner.objects
        .select_related(
            "category",
            "blog",
        )
    )

    serializer_class = BannerWriteSerializer