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 rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from django_filters.rest_framework import DjangoFilterBackend
from .models import Notice
from .serializers import NoticeSerializer
from core.filters import NoticeFilter


@extend_schema(tags=["Notices"])
class NoticeListView(BaseListCreateView):
    serializer_class = NoticeSerializer
    parser_classes = [MultiPartParser, FormParser, JSONParser]
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = NoticeFilter
    ordering_fields = ["date", "created_at", "is_pinned"]
    ordering = ["-is_pinned", "-date"]

    def initialize_request(self, request, *args, **kwargs):
        # self.request isn't set yet when get_authenticators()/get_permissions()
        # run during request initialization (drf_spectacular also calls this
        # directly when building /schema/), so stash the method up front.
        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 Notice.objects.all()


@extend_schema(tags=["Notices"])
class NoticeDetailView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = NoticeSerializer
    permission_classes = [IsAdminUser]
    parser_classes = [MultiPartParser, FormParser, JSONParser]
    queryset = Notice.objects.all()
    lookup_field = "pk"
    http_method_names = ['get', 'patch', 'delete']