from rest_framework import generics
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import BlogPost, BlogCategory, BlogTag, BlogLike
from .serializers import (
    BlogCategorySerializer,
    BlogTagSerializer,
    BlogListSerializer,
    BlogDetailSerializer,
)
from django.shortcuts import get_object_or_404
from .pagination import BlogPagination
from django.db.models import Q, F


# List Blogs
class BlogListView(generics.ListAPIView):

    serializer_class = BlogListSerializer
    pagination_class = BlogPagination
    
    queryset = BlogPost.objects.filter(
        status="published",
        category__is_active = True,
    ).select_related(
        "category"
    )


# Blog detail
class BlogDetailView(generics.RetrieveAPIView):

    serializer_class = BlogDetailSerializer

    lookup_field = "slug"

    queryset = BlogPost.objects.filter(
        status="published"
    ).select_related(
        "category"
    ).prefetch_related(
        "tags"
    )


# List of featured blogs
class FeaturedBlogsView(generics.ListAPIView):

    serializer_class = BlogListSerializer

    queryset = BlogPost.objects.filter(
        status="published",
        is_featured=True
    )



# List Blog Categories
class CategoryListView(generics.ListAPIView):

    serializer_class = BlogCategorySerializer

    queryset = BlogCategory.objects.filter(
        is_active=True
    )

# List tags
class TagListView(generics.ListAPIView):

    serializer_class = BlogTagSerializer

    queryset = BlogTag.objects.all()


# Blog Search
class BlogSearchView(generics.ListAPIView):

    serializer_class = BlogListSerializer

    def get_queryset(self):

        query = self.request.GET.get(
            "q",
            ""
        )

        return BlogPost.objects.filter(
            status="published"
        ).filter(
            Q(title__icontains=query)
            |
            Q(content__icontains=query)
            |
            Q(excerpt__icontains=query)
        )

# Related Posts
class RelatedPostsView(generics.ListAPIView):

    serializer_class = BlogListSerializer

    def get_queryset(self):

        slug = self.kwargs["slug"]

        current_post = BlogPost.objects.get(
            slug=slug
        )

        return BlogPost.objects.filter(
            category=current_post.category,
            status="published"
        ).exclude(
            id=current_post.id
        )[:4]
    
@api_view(["POST"])
def toggle_like(request, slug):

    blog = get_object_or_404(
        BlogPost,
        slug=slug
    )

    visitor_id = request.data.get("visitor_id")
    if not visitor_id:
        return Response({'error':'no visitor ID'})

    like = BlogLike.objects.filter(
        blog=blog,
        visitor_id=visitor_id
    ).first()

    if like:

        like.delete()

        BlogPost.objects.filter(
            id=blog.id,
            likes_count__gt=0
        ).update(
            likes_count=F("likes_count") - 1
        )

        return Response({
            "liked": False
        })

    BlogLike.objects.create(
        blog=blog,
        visitor_id=visitor_id
    )

    BlogPost.objects.filter(
        id=blog.id
    ).update(
        likes_count=F("likes_count") + 1
    )

    return Response({
        "liked": True
    })

@api_view(["GET"])
def like_status(request, slug):
    visitor_id = request.GET.get("visitor_id")

    liked = BlogLike.objects.filter(
        blog__slug=slug,
        visitor_id=visitor_id
    ).exists()

    return Response({
        "liked": liked
    })