from rest_framework import serializers
from .models import FeedbackEvent, FeedbackCategory, Feedback, FeedbackConfiguration


class FeedbackEventSerializer(serializers.ModelSerializer):
    feedback_count = serializers.ReadOnlyField()

    class Meta:
        model = FeedbackEvent
        fields = ['id', 'name', 'slug', 'description', 'is_active', 'is_stats_published', 'is_archived', 'archived_at', 'feedback_count', 'created_at', 'updated_at']
        read_only_fields = ['slug', 'archived_at', 'created_at', 'updated_at']


class FeedbackCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = FeedbackCategory
        fields = ['id', 'name', 'description', 'is_active', 'created_at']


class FeedbackSerializer(serializers.ModelSerializer):
    event_name = serializers.CharField(source='feedback_event.name', read_only=True)
    category_name = serializers.CharField(source='category.name', read_only=True)
    rating_display = serializers.CharField(source='get_rating_display', read_only=True)

    class Meta:
        model = Feedback
        fields = [
            'id', 'feedback_event', 'event_name', 'category', 'category_name',
            'rating', 'rating_display', 'comment', 'name', 'email',
            'registration_code', 'is_anonymous', 'ip_address',
            'is_published', 'created_at',
        ]
        read_only_fields = ['ip_address', 'created_at']


class PublicFeedbackSerializer(serializers.ModelSerializer):
    """Serializer for public feedback submission."""

    class Meta:
        model = Feedback
        fields = ['feedback_event', 'category', 'rating', 'comment', 'name', 'email', 'registration_code', 'is_anonymous']

    def validate_feedback_event(self, event):
        if not event.is_active or event.is_archived:
            raise serializers.ValidationError('This feedback event is not currently active.')
        config = FeedbackConfiguration.get_config()
        if not config.feedback_enabled:
            raise serializers.ValidationError('Feedback collection is currently disabled.')
        return event

    def validate(self, data):
        if not data.get('is_anonymous'):
            if not data.get('name') and not data.get('email') and not data.get('registration_code'):
                raise serializers.ValidationError('Please provide your name, email, or registration code, or submit anonymously.')
        return data


class FeedbackConfigSerializer(serializers.ModelSerializer):
    active_event_name = serializers.CharField(source='active_event.name', read_only=True)

    class Meta:
        model = FeedbackConfiguration
        fields = [
            'id', 'active_event', 'active_event_name',
            'feedback_enabled', 'welcome_message', 'thank_you_message',
            'disabled_message', 'updated_at',
        ]
        read_only_fields = ['updated_at']
