from rest_framework.mixins import RetrieveModelMixin, ListModelMixin
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from drf_spectacular.utils import extend_schema_view, extend_schema
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from .serializers import BlogListSerializer, BlogDetailSerializer
from .models import Blog
  
@extend_schema_view(
    list=extend_schema(
        summary='List Blogs',
        description='Returns a list of all blogs.',
        tags=['Blogs'],
    ),
    retrieve=extend_schema(
        summary='Retrieve a Blog',
        description='Retrieve detailed information about a specific blog.',
        tags=['Blogs'],
    ) 
)
class BlogViewSet(RetrieveModelMixin, ListModelMixin, viewsets.GenericViewSet):
    queryset = Blog.objects.all().prefetch_related('images', 'tags').order_by('-created_at')
    permission_classes = [AllowAny]
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['category', 'tags']
    search_fields = ['title', 'subtitle', 'category__name', 'tags__name']
    ordering_fields = ['created_at', 'updated_at', 'views', 'id']
    ordering = ['-created_at']

    def get_serializer_class(self):
        if self.action == 'list':
            return BlogListSerializer
        if self.action == 'retrieve':
            return BlogDetailSerializer
        return super().get_serializer_class()

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.views += 1
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)