from rest_framework import generics, permissions, filters
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from django.utils import timezone
from .models import Event
from .serializers import EventSerializer


class EventListCreateView(generics.ListCreateAPIView):
    serializer_class = EventSerializer
    parser_classes = [MultiPartParser, FormParser, JSONParser]
    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['title', 'location', 'organizer']
    ordering_fields = ['start_date', 'created_at']

    def get_permissions(self):
        # Public GET — PHP website can fetch without auth
        if self.request.method == 'GET':
            return [permissions.AllowAny()]
        return [permissions.IsAuthenticated()]

    def get_queryset(self):
        queryset = Event.objects.select_related('department')
        event_type = self.request.query_params.get('type')
        upcoming = self.request.query_params.get('upcoming')
        department = self.request.query_params.get('department')
        active_only = self.request.query_params.get('active', 'true')

        if active_only == 'true':
            queryset = queryset.filter(is_active=True)
        if event_type:
            queryset = queryset.filter(event_type=event_type)
        if upcoming == 'true':
            queryset = queryset.filter(start_date__gt=timezone.now())
        if department:
            queryset = queryset.filter(department_id=department)
        return queryset

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context['request'] = self.request
        return context


class EventDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Event.objects.select_related('department')
    serializer_class = EventSerializer
    parser_classes = [MultiPartParser, FormParser, JSONParser]

    def get_permissions(self):
        if self.request.method == 'GET':
            return [permissions.AllowAny()]
        return [permissions.IsAuthenticated()]

    def get_serializer_context(self):
        context = super().get_serializer_context()
        context['request'] = self.request
        return context


class UpcomingEventsView(APIView):
    permission_classes = [permissions.AllowAny]

    def get(self, request):
        events = Event.objects.filter(
            start_date__gt=timezone.now(),
            is_active=True
        ).order_by('start_date')[:10]
        serializer = EventSerializer(
            events, many=True, context={'request': request}
        )
        return Response(serializer.data)