from rest_framework import viewsets, status, filters
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticatedOrReadOnly, IsAuthenticated
from django_filters.rest_framework import DjangoFilterBackend
from django.utils import timezone
from .models import Ad
from .serializers import AdSerializer
from common.permissions import IsSuperAdmin
from common.pagination import StandardResultsSetPagination


class AdViewSet(viewsets.ModelViewSet):
    """Ad ViewSet"""
    permission_classes = [IsAuthenticatedOrReadOnly]
    pagination_class = StandardResultsSetPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['is_active', 'action_type']
    search_fields = ['title', 'subtitle']
    ordering_fields = ['priority', 'start_date', 'end_date', 'created_at']
    ordering = ['-priority', '-created_at']
    
    def get_serializer_class(self):
        return AdSerializer
    
    def get_queryset(self):
        queryset = Ad.objects.all()
        
        # Filter active ads by default for list view
        if self.action == 'list':
            now = timezone.now()
            queryset = queryset.filter(
                is_active=True,
                start_date__lte=now,
                end_date__gte=now
            )
        
        return queryset
    
    def get_permissions(self):
        if self.action in ['create', 'update', 'partial_update', 'destroy']:
            return [IsAuthenticated(), IsSuperAdmin()]
        return super().get_permissions()
    
    @action(detail=False, methods=['get'])
    def active(self, request):
        """Get all active ads"""
        now = timezone.now()
        ads = Ad.objects.filter(
            is_active=True,
            start_date__lte=now,
            end_date__gte=now
        ).order_by('-priority', '-created_at')
        
        serializer = self.get_serializer(ads, many=True)
        return Response(serializer.data)
