"""DRF serializers for the public scholarship API.

PRD §4.3.4 — read-only views over Scholarship + Scholar so other modules
(MEL, alumni, RIMS dashboards) can ingest the data without touching ORM
internals. Sensitive fields (notes, internal references) are intentionally
omitted.
"""
from __future__ import annotations

from rest_framework import serializers

from apps.rims.scholarships.models import (
    GraduationRecord,
    ProgressReport,
    Scholar,
    Scholarship,
    Stipend,
)


class ScholarshipSerializer(serializers.ModelSerializer):
    class Meta:
        model = Scholarship
        fields = ("id", "name", "description", "is_active")


class StipendSerializer(serializers.ModelSerializer):
    class Meta:
        model = Stipend
        fields = ("id", "amount", "currency", "paid_on", "reference")


class ProgressReportSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProgressReport
        fields = ("id", "period_label", "submitted_at", "notes")


class GraduationSerializer(serializers.ModelSerializer):
    class Meta:
        model = GraduationRecord
        fields = ("graduated_on", "certificate_issued")


class ScholarSerializer(serializers.ModelSerializer):
    scholarship = ScholarshipSerializer(read_only=True)
    stipends = StipendSerializer(many=True, read_only=True)
    progress_reports = ProgressReportSerializer(many=True, read_only=True)
    graduation = GraduationSerializer(read_only=True)
    user_email = serializers.CharField(source="user.email", read_only=True)
    user_name = serializers.SerializerMethodField()

    class Meta:
        model = Scholar
        fields = (
            "id",
            "user_email",
            "user_name",
            "scholarship",
            "cohort_year",
            "status",
            "status_changed_at",
            "withdrawn_reason",
            "enrolled_at",
            "stipends",
            "progress_reports",
            "graduation",
        )

    def get_user_name(self, obj):
        return obj.user.get_full_name() or obj.user.email
