from drf_spectacular.utils import extend_schema
from core.views import BaseListCreateView
from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.permissions import AllowAny, IsAdminUser
from django_filters.rest_framework import DjangoFilterBackend
from .models import Faculty
from .serializers import FacultySerializer
from core.filters import FacultyFilter
from rest_framework import generics


@extend_schema(tags=["Faculty"])
class FacultyListView(BaseListCreateView):
    serializer_class = FacultySerializer
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = FacultyFilter
    ordering_fields = ["full_name", "is_featured", "order"]
    ordering = ["-is_featured", "order", "full_name"]

    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 Faculty.objects.all()


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