from rest_framework import viewsets, generics, filters, status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
from django.utils import timezone
from django_filters.rest_framework import DjangoFilterBackend
from .models import Category, News, ImageGallery
from .serializers import (
    CategorySerializer,
    NewsListSerializer,
    NewsDetailSerializer,
    NewsCreateUpdateSerializer,
    ImageGallerySerializer
)


class CategoryViewSet(viewsets.ReadOnlyModelViewSet):
    """
    Read-only ViewSet for Category model (GET only)
    Provides list and retrieve operations
    """
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    lookup_field = 'slug'
    
    @action(detail=True, methods=['get'])
    def news(self, request, slug=None):
        """Get all news items for a specific category"""
        category = self.get_object()
        news_items = category.news_items.filter(is_active=True).order_by('-publish_date')
        serializer = NewsListSerializer(news_items, many=True, context={'request': request})
        return Response(serializer.data)


class NewsViewSet(viewsets.ReadOnlyModelViewSet):
    """
    Read-only ViewSet for News model (GET only)
    Provides list and retrieve operations and read-only custom actions
    """
    queryset = News.objects.filter(is_active=True)
    lookup_field = 'slug'
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['category', 'is_active', 'publish_date']
    search_fields = ['title', 'short_description', 'description']
    ordering_fields = ['publish_date', 'created_at', 'title']
    ordering = ['-publish_date']
    
    def get_serializer_class(self):
        """Return appropriate serializer based on action"""
        if self.action == 'list':
            return NewsListSerializer
        elif self.action in ['create', 'update', 'partial_update']:
            return NewsCreateUpdateSerializer
        return NewsDetailSerializer
    
    @action(detail=False, methods=['get'])
    def featured(self, request):
        """Get featured/latest news items (limit 5)"""
        featured_news = self.queryset.order_by('-publish_date')[:5]
        serializer = NewsListSerializer(featured_news, many=True, context={'request': request})
        return Response(serializer.data)
    
    @action(detail=False, methods=['get'])
    def by_category(self, request):
        """Get news grouped by category"""
        categories = Category.objects.all()
        result = []
        for category in categories:
            news_items = self.queryset.filter(category=category).order_by('-publish_date')[:5]
            result.append({
                'category': CategorySerializer(category).data,
                'news': NewsListSerializer(news_items, many=True, context={'request': request}).data
            })
        return Response(result)


class NewsListView(generics.ListAPIView):
    """
    GET API for listing all active news
    Endpoint: /api/news/
    """
    queryset = News.objects.filter(is_active=True)
    serializer_class = NewsListSerializer
    permission_classes = [AllowAny]
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['category', 'publish_date']
    search_fields = ['title', 'short_description']
    ordering_fields = ['publish_date', 'created_at']
    ordering = ['-publish_date']


class NewsDetailView(generics.RetrieveAPIView):
    """
    GET API for news detail by slug
    Endpoint: /api/news/<slug>/
    """
    queryset = News.objects.filter(is_active=True)
    serializer_class = NewsDetailSerializer
    permission_classes = [AllowAny]
    lookup_field = 'slug'


class CategoryListView(generics.ListAPIView):
    """
    GET API for listing all categories
    Endpoint: /api/news/categories/
    """
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [AllowAny]


class ImageGalleryListView(generics.ListAPIView):
    """
    Read-only image gallery list for a news item.
    Endpoint: /api/news/<news_id>/gallery/
    Only GET is allowed (public).
    """
    serializer_class = ImageGallerySerializer
    permission_classes = [AllowAny]

    def get_queryset(self):
        news_id = self.kwargs.get('news_id')
        return ImageGallery.objects.filter(news_id=news_id)
