from django.utils import timezone
from rest_framework import permissions, viewsets

from apps.rims.grants.models import Application, Award, GrantCall, InterviewSchedule, VerificationRecord
from apps.rims.grants.serializers import (
    ApplicationSerializer,
    AwardSerializer,
    GrantCallSerializer,
    InterviewScheduleSerializer,
    VerificationRecordSerializer,
)

from .permissions import (
    scope_application_qs,
    scope_award_qs,
    scope_interview_qs,
    scope_verification_qs,
)


class GrantCallViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = GrantCallSerializer
    permission_classes = [permissions.AllowAny]
    lookup_field = "slug"

    def get_queryset(self):
        return GrantCall.objects.filter(
            status=GrantCall.Status.PUBLISHED,
            closes_at__gte=timezone.now(),
        ).order_by("-opens_at")


class ApplicationViewSet(viewsets.ReadOnlyModelViewSet):
    """PRD §5.1 FRFA — programme-scoped via ``call.funding_record`` FKs.

    Visible rows: applicant's own + admins/superusers + grants/program staff
    assigned as ``grant_manager``/``program_lead`` on the parent funding
    record + finance staff assigned as ``finance_officer``.
    """

    serializer_class = ApplicationSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        qs = Application.objects.select_related("call", "call__funding_record").prefetch_related(
            "interviews", "verification_records"
        )
        return scope_application_qs(self.request.user, qs)


class AwardViewSet(viewsets.ReadOnlyModelViewSet):
    """PRD §5.1 FRFA — programme-scoped via ``application.call.funding_record``."""

    serializer_class = AwardSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        qs = Award.objects.select_related(
            "application__call",
            "application__call__funding_record",
            "application__applicant",
        ).order_by("-awarded_at", "-pk")
        return scope_award_qs(self.request.user, qs)


class InterviewScheduleViewSet(viewsets.ReadOnlyModelViewSet):
    """PRD §5.1 FRFA-AM030 — interview schedules visible only to applicant + programme staff."""

    serializer_class = InterviewScheduleSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        qs = InterviewSchedule.objects.select_related(
            "application",
            "application__call",
            "application__call__funding_record",
        )
        return scope_interview_qs(self.request.user, qs)


class VerificationRecordViewSet(viewsets.ReadOnlyModelViewSet):
    """PRD §5.1 FRFA-AM031 — verification records visible only to applicant + programme staff."""

    serializer_class = VerificationRecordSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        qs = VerificationRecord.objects.select_related(
            "application",
            "application__call",
            "application__call__funding_record",
        )
        return scope_verification_qs(self.request.user, qs)
