from rest_framework import serializers
from .models import Registration, PaymentProof
from apps.events.serializers import EventListSerializer


class PaymentProofSerializer(serializers.ModelSerializer):
    class Meta:
        model = PaymentProof
        fields = ['id', 'file', 'uploaded_at', 'notes', 'reviewed', 'reviewed_at']
        read_only_fields = ['uploaded_at', 'reviewed', 'reviewed_at']


class RegistrationSerializer(serializers.ModelSerializer):
    event_name = serializers.CharField(source='event.name', read_only=True)
    event_details = EventListSerializer(source='event', read_only=True)
    payment_proof = PaymentProofSerializer(read_only=True)
    status_display = serializers.CharField(source='get_status_display', read_only=True)
    payment_status_display = serializers.CharField(source='get_payment_status_display', read_only=True)

    class Meta:
        model = Registration
        fields = [
            'id', 'registration_code', 'full_name', 'email', 'phone',
            'organisation', 'event', 'event_name', 'event_details',
            'status', 'status_display', 'payment_status', 'payment_status_display',
            'has_attended', 'attendance_timestamp', 'notes', 'payment_proof',
            'registered_at', 'updated_at',
        ]
        read_only_fields = ['registration_code', 'registered_at', 'updated_at', 'has_attended', 'attendance_timestamp']


class PublicRegistrationSerializer(serializers.ModelSerializer):
    """Serializer for public-facing registration (no sensitive admin fields)."""

    class Meta:
        model = Registration
        fields = ['id', 'registration_code', 'full_name', 'email', 'phone', 'organisation', 'event', 'status', 'payment_status', 'registered_at']
        read_only_fields = ['registration_code', 'status', 'payment_status', 'registered_at']

    def validate_event(self, event):
        if not event.is_active or event.is_archived:
            raise serializers.ValidationError('This event is no longer active.')
        if not event.is_registerable:
            raise serializers.ValidationError('Registration is not open for this event.')
        if event.is_at_capacity:
            raise serializers.ValidationError('This event has reached maximum capacity.')
        return event


class VerifyCodeSerializer(serializers.Serializer):
    registration_code = serializers.CharField(max_length=20)


class UpdateRegistrationStatusSerializer(serializers.Serializer):
    status = serializers.ChoiceField(choices=Registration.STATUS_CHOICES, required=False)
    payment_status = serializers.ChoiceField(choices=Registration.PAYMENT_STATUS_CHOICES, required=False)
