from drf_spectacular.utils import extend_schema
from core.views import BaseListCreateView
from rest_framework import generics
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.permissions import AllowAny, IsAdminUser
from django_filters.rest_framework import DjangoFilterBackend
from .models import Event, EventStatus
from .serializers import EventSerializer
from core.filters import EventFilter


@extend_schema(tags=["Events"])
class EventListView(BaseListCreateView):
    serializer_class = EventSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = EventFilter
    ordering_fields = ["date", "created_at", "is_featured"]
    ordering = ["-is_featured", "-date"]

    def initialize_request(self, request, *args, **kwargs):
        self._http_method = request.method
        return super().initialize_request(request, *args, **kwargs)

    def get_permissions(self):
        if self._http_method == "GET":
            return [AllowAny()]
        return []

    def get_authenticators(self):
        if self._http_method == "GET":
            return []
        return super().get_authenticators()

    def get_queryset(self):
        return Event.objects.all()


@extend_schema(tags=["Events"])
class EventDetailView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = EventSerializer
    permission_classes = [IsAdminUser]
    queryset = Event.objects.all()
    lookup_field = "pk"
    http_method_names = ['get', 'patch', 'delete']