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 Offer
from .serializers import OfferSerializer
from common.permissions import IsPlaceAdmin, IsPlaceOwner
from common.pagination import StandardResultsSetPagination


class OfferViewSet(viewsets.ModelViewSet):
    """Offer ViewSet"""
    permission_classes = [IsAuthenticatedOrReadOnly]
    pagination_class = StandardResultsSetPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ['place', 'is_active']
    search_fields = ['title', 'description']
    ordering_fields = ['start_date', 'end_date', 'created_at']
    ordering = ['-start_date']
    
    def get_serializer_class(self):
        return OfferSerializer
    
    def get_queryset(self):
        queryset = Offer.objects.select_related('place').all()
        
        # Filter active offers 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
            )
        
        # Filter by place if provided
        place_id = self.request.query_params.get('place')
        if place_id:
            queryset = queryset.filter(place_id=place_id)
        
        return queryset
    
    def get_permissions(self):
        if self.action in ['create', 'update', 'partial_update', 'destroy']:
            return [IsAuthenticated(), IsPlaceAdmin()]
        return super().get_permissions()
    
    def perform_create(self, serializer):
        # Only place admin can create offers for their place
        user = self.request.user
        if user.role == 'place_admin' and hasattr(user, 'place_admin_profile'):
            serializer.save(place=user.place_admin_profile.place)
        else:
            raise PermissionError('Only place admins can create offers')
