from rest_framework import serializers

from apps.rims.grants.models import (
    Application,
    Award,
    GrantCall,
    InterviewSchedule,
    VerificationRecord,
)


class GrantCallSerializer(serializers.ModelSerializer):
    class Meta:
        model = GrantCall
        fields = (
            "id",
            "title",
            "slug",
            "call_type",
            "status",
            "opens_at",
            "closes_at",
            "interview_required",
            "verification_required",
            "verification_type",
            "reviewers_per_application",
            "review_score_threshold",
            "tie_break_policy",
            "reviewer_workload_mode",
            "budget_ceiling",
        )
        read_only_fields = fields


class ApplicationSerializer(serializers.ModelSerializer):
    call_slug = serializers.CharField(source="call.slug", read_only=True)
    call_title = serializers.CharField(source="call.title", read_only=True)
    latest_interview_status = serializers.SerializerMethodField()
    latest_verification_status = serializers.SerializerMethodField()

    class Meta:
        model = Application
        fields = (
            "id",
            "call",
            "call_slug",
            "call_title",
            "status",
            "submitted_at",
            "eligibility_notes",
            "ranking_score",
            "ranking_position",
            "tied_in_ranking",
            "shortlist_recommended",
            "interview_completed",
            "latest_interview_status",
            "latest_verification_status",
            "created_at",
        )
        read_only_fields = fields

    def get_latest_interview_status(self, obj):
        latest = obj.interviews.order_by("-scheduled_for").first()
        return latest.status if latest else None

    def get_latest_verification_status(self, obj):
        latest = obj.verification_records.order_by("-created_at").first()
        return latest.status if latest else None


class VerificationRecordSerializer(serializers.ModelSerializer):
    class Meta:
        model = VerificationRecord
        fields = "__all__"
        read_only_fields = (
            "id",
            "application",
            "verification_type",
            "status",
            "score",
            "summary",
            "findings",
            "verified_by",
            "verified_at",
            "created_at",
        )


class InterviewScheduleSerializer(serializers.ModelSerializer):
    class Meta:
        model = InterviewSchedule
        fields = "__all__"
        read_only_fields = (
            "id",
            "application",
            "scheduled_for",
            "format",
            "venue",
            "notes",
            "status",
            "created_by",
            "updated_by",
            "created_at",
            "updated_at",
        )


class AwardSerializer(serializers.ModelSerializer):
    application_id = serializers.IntegerField(source="application.pk", read_only=True)
    call_slug = serializers.CharField(source="application.call.slug", read_only=True)

    class Meta:
        model = Award
        fields = (
            "id",
            "application_id",
            "call_slug",
            "amount",
            "currency",
            "status",
            "activation_date",
            "project_end_date",
            "closeout_ready_at",
            "closed_at",
            "cancelled_at",
        )
        read_only_fields = fields
