from rest_framework.viewsets import ReadOnlyModelViewSet, ModelViewSet
from rest_framework.permissions import IsAuthenticated
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter

from core.pagination import DefaultPagination
from core.permissions import DjangoModelPermissionsWithView
from core.responses import success_response
from .models import Country, State, City, Education, NoticePeriod, AnnualCTC, Language
from .serializers import CountrySerializer, StateSerializer, CitySerializer, EducationSerializer, NoticePeriodSerializer, AnnualCTCSerializer, LanguageSerializer



class EducationViewSet(ModelViewSet):
    """Admin CRUD for the qualification master list."""
    queryset = Education.objects.all()
    serializer_class = EducationSerializer
    permission_classes = [DjangoModelPermissionsWithView]
    pagination_class = DefaultPagination
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ["name"]
    ordering_fields = ["name", "sort_order", "created_at"]
    ordering = ["sort_order", "name"]

    def list(self, request, *args, **kwargs):
        qs = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(qs)
        if page is not None:
            return self.get_paginated_response(self.get_serializer(page, many=True).data)
        return success_response(self.get_serializer(qs, many=True).data)


class MasterDataPagination(DefaultPagination):
    """Location dropdowns load a full result set in one request
    (250 countries, up to ~220 states/country, ~1.8k cities/state)."""
    max_page_size = 2000


class CountryViewSet(ReadOnlyModelViewSet):
    queryset = Country.objects.all()
    serializer_class = CountrySerializer
    permission_classes = [IsAuthenticated]
    pagination_class = MasterDataPagination
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    search_fields = ["name", "region", "subregion", "iso2", "iso3"]
    ordering_fields = ["name"]
    ordering = ["name"]

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return success_response(serializer.data)


class StateViewSet(ReadOnlyModelViewSet):
    queryset = State.objects.select_related("country").all()
    serializer_class = StateSerializer
    permission_classes = [IsAuthenticated]
    pagination_class = MasterDataPagination
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    search_fields = ["name", "country__name", "country_code"]
    ordering_fields = ["name"]
    ordering = ["name"]

    def get_queryset(self):
        queryset = super().get_queryset()
        country_id = self.request.query_params.get("country_id") or self.request.query_params.get("countryId")
        if country_id:
            queryset = queryset.filter(country_id=country_id)
        return queryset

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return success_response(serializer.data)


class CityViewSet(ReadOnlyModelViewSet):
    queryset = City.objects.select_related("country", "state").all()
    serializer_class = CitySerializer
    permission_classes = [IsAuthenticated]
    pagination_class = MasterDataPagination
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    search_fields = ["name", "state__name", "country__name", "country_code"]
    ordering_fields = ["name"]
    ordering = ["name"]

    def get_queryset(self):
        queryset = super().get_queryset()
        state_id = self.request.query_params.get("state_id") or self.request.query_params.get("stateId")
        country_id = self.request.query_params.get("country_id") or self.request.query_params.get("countryId")
        country_name = self.request.query_params.get("country_name") or self.request.query_params.get("country")
        if state_id:
            queryset = queryset.filter(state_id=state_id)
        if country_id:
            queryset = queryset.filter(country_id=country_id)
        elif country_name:
            queryset = queryset.filter(country__name__iexact=country_name)
        return queryset

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return success_response(serializer.data)


class NoticePeriodViewSet(ReadOnlyModelViewSet):
    queryset = NoticePeriod.objects.filter(is_active=True).order_by("sort_order", "value")
    serializer_class = NoticePeriodSerializer
    permission_classes = [IsAuthenticated]
    pagination_class = None

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return success_response(serializer.data)


class AnnualCTCViewSet(ReadOnlyModelViewSet):
    queryset = AnnualCTC.objects.filter(is_active=True).order_by("sort_order", "value")
    serializer_class = AnnualCTCSerializer
    permission_classes = [IsAuthenticated]
    pagination_class = None

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return success_response(serializer.data)


class LanguageViewSet(ReadOnlyModelViewSet):
    queryset = Language.objects.filter(is_active=True).order_by("sort_order", "name")
    serializer_class = LanguageSerializer
    permission_classes = [IsAuthenticated]
    pagination_class = None

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset, many=True)
        return success_response(serializer.data)

