"""
Сериализаторы для уведомлений.
"""
from rest_framework import serializers
from .models import Notification, NotificationPreference, ParentChildNotificationSettings, PushSubscription


class NotificationSerializer(serializers.ModelSerializer):
    """Сериализатор для уведомления."""
    
    type_display = serializers.CharField(source='get_notification_type_display', read_only=True)
    channel_display = serializers.CharField(source='get_channel_display', read_only=True)
    
    class Meta:
        model = Notification
        fields = [
            'id', 'notification_type', 'type_display', 'channel', 'channel_display',
            'priority', 'title', 'message', 'data', 'action_url',
            'is_read', 'read_at', 'is_sent', 'created_at'
        ]
        read_only_fields = [
            'id', 'is_sent', 'read_at', 'created_at'
        ]


class NotificationPreferenceSerializer(serializers.ModelSerializer):
    """Сериализатор для настроек уведомлений."""
    
    class Meta:
        model = NotificationPreference
        fields = [
            'id', 'enabled', 'email_enabled', 'telegram_enabled',
            'in_app_enabled', 'type_preferences', 'quiet_hours_enabled',
            'quiet_hours_start', 'quiet_hours_end'
        ]
        read_only_fields = ['id']


class ParentChildNotificationSettingsSerializer(serializers.ModelSerializer):
    """Сериализатор для настроек уведомлений родителя для ребенка."""
    
    child_name = serializers.CharField(source='child.user.get_full_name', read_only=True)
    child_id = serializers.IntegerField(source='child.user.id', read_only=True)
    
    class Meta:
        model = ParentChildNotificationSettings
        fields = [
            'id', 'parent', 'child', 'child_id', 'child_name',
            'enabled', 'type_settings', 'created_at', 'updated_at'
        ]
        read_only_fields = ['id', 'parent', 'child', 'created_at', 'updated_at']
    
    def validate_type_settings(self, value):
        """Валидация настроек типов уведомлений."""
        if not isinstance(value, dict):
            raise serializers.ValidationError("type_settings должен быть словарем")
        
        # Проверяем, что все значения - булевы
        from .models import Notification
        valid_types = [choice[0] for choice in Notification.TYPE_CHOICES]
        
        for key, val in value.items():
            if key not in valid_types:
                raise serializers.ValidationError(f"Неизвестный тип уведомления: {key}")
            if not isinstance(val, bool):
                raise serializers.ValidationError(f"Значение для {key} должно быть булевым")
        
        return value


class PushSubscriptionSerializer(serializers.ModelSerializer):
    """Сериализатор для Push Subscription."""
    
    class Meta:
        model = PushSubscription
        fields = ['id', 'subscription_data', 'user_agent', 'is_active', 'created_at', 'updated_at']
        read_only_fields = ['id', 'created_at', 'updated_at']
