from rest_framework import serializers
from .models import AdmissionInquiry, AdmissionStatusHistory, AdmissionStatus


class AdmissionStatusHistorySerializer(serializers.ModelSerializer):
    changed_by_name = serializers.CharField(
        source="changed_by.get_full_name", read_only=True
    )

    class Meta:
        model = AdmissionStatusHistory
        fields = "__all__"
        read_only_fields = ["id", "created_at", "updated_at"]


class AdmissionInquiryListSerializer(serializers.ModelSerializer):
    """Lightweight — for admin list/table view."""

    program_name = serializers.CharField(source="program.name", read_only=True)

    class Meta:
        model = AdmissionInquiry
        fields = "__all__"
        read_only_fields = ["id", "created_at", "updated_at"]


class AdmissionInquiryDetailSerializer(serializers.ModelSerializer):
    """Full detail — for admin single record view with history."""

    program_name = serializers.CharField(source="program.name", read_only=True)
    reviewed_by_name = serializers.CharField(
        source="reviewed_by.get_full_name", read_only=True
    )
    status_history = AdmissionStatusHistorySerializer(many=True, read_only=True)

    class Meta:
        model = AdmissionInquiry
        fields = "__all__"
        read_only_fields = ["id", "created_at", "updated_at"]


class AdmissionInquiryWriteSerializer(serializers.ModelSerializer):
    """Public submission form — only what an applicant fills in."""

    class Meta:
        model = AdmissionInquiry
        fields = [
            "full_name",
            "email",
            "phone",
            "gender",
            "date_of_birth",
            "address",
            "nationality",
            "last_institution",
            "last_qualification",
            "last_gpa_or_percent",
            "passing_year",
            "program",
            "academic_year",
            "message",
            "source",
            "citizenship_url",
            "transcript_url",
            "photo_url",
        ]

    def validate_phone(self, value):
        if value and not value.replace("+", "").replace("-", "").isdigit():
            raise serializers.ValidationError("Enter a valid phone number.")
        return value

    def validate_passing_year(self, value):
        if value and (value < 1990 or value > 2030):
            raise serializers.ValidationError(
                "Enter a valid passing year between 1990 and 2030."
            )
        return value


class AdmissionStatusUpdateSerializer(serializers.Serializer):
    """Admin-only: update status with an optional note."""

    status = serializers.ChoiceField(choices=AdmissionStatus.choices)
    note = serializers.CharField(required=False, allow_blank=True)
