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 Program
from .serializers import ProgramSerializer, ProgramListSerializer, ProgramDetailSerializer
from core.filters import ProgramFilter
from rest_framework import generics


@extend_schema(tags=["Programs"])
class ProgramListView(BaseListCreateView):
    serializer_class = ProgramSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_class = ProgramFilter
    ordering_fields = ['name', 'level', 'created_at']

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


@extend_schema(tags=["Programs"])
class ProgramDetailView(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = ProgramSerializer
    permission_classes = [IsAdminUser]
    queryset = Program.objects.all()
    http_method_names = ['get', 'patch', 'delete']