from rest_framework import serializers
from .models import Notification, Favorite, Activity, Report


class NotificationSerializer(serializers.ModelSerializer):
    """Notification Serializer"""
    class Meta:
        model = Notification
        fields = ['id', 'type', 'title', 'message', 'data', 'is_read', 'created_at']
        read_only_fields = ['id', 'created_at']


class FavoriteSerializer(serializers.ModelSerializer):
    """Favorite Serializer"""
    place_name = serializers.CharField(source='place.name', read_only=True)
    place_image = serializers.CharField(source='place.image.url', read_only=True, allow_null=True)
    place_rating = serializers.DecimalField(source='place.rating', read_only=True, max_digits=3, decimal_places=2)
    
    class Meta:
        model = Favorite
        fields = ['id', 'place', 'place_name', 'place_image', 'place_rating', 'created_at']
        read_only_fields = ['id', 'created_at']
    
    def create(self, validated_data):
        validated_data['user'] = self.context['request'].user
        return super().create(validated_data)


class ActivitySerializer(serializers.ModelSerializer):
    """Activity Serializer"""
    place_name = serializers.CharField(source='place.name', read_only=True, allow_null=True)
    
    class Meta:
        model = Activity
        fields = ['id', 'type', 'place', 'place_name', 'description', 'metadata', 'created_at']
        read_only_fields = ['id', 'created_at']
    
    def create(self, validated_data):
        validated_data['user'] = self.context['request'].user
        return super().create(validated_data)


class ReportSerializer(serializers.ModelSerializer):
    """Report Serializer"""
    reporter_username = serializers.CharField(source='reporter.username', read_only=True)
    place_name = serializers.CharField(source='place.name', read_only=True, allow_null=True)
    place_slug = serializers.CharField(source='place.slug', read_only=True, allow_null=True)
    review_id = serializers.IntegerField(source='review.id', read_only=True, allow_null=True)
    review_comment = serializers.CharField(source='review.comment', read_only=True, allow_null=True)
    report_type_display = serializers.CharField(source='get_report_type_display', read_only=True)
    status_display = serializers.CharField(source='get_status_display', read_only=True)
    resolved_by_username = serializers.CharField(source='resolved_by.username', read_only=True, allow_null=True)
    
    class Meta:
        model = Report
        fields = [
            'id', 'reporter', 'reporter_username', 'report_type', 'report_type_display',
            'status', 'status_display', 'place', 'place_name', 'place_slug',
            'review', 'review_id', 'review_comment', 'reason', 'description',
            'evidence', 'admin_notes', 'resolved_by', 'resolved_by_username',
            'resolved_at', 'created_at', 'updated_at'
        ]
        read_only_fields = ['id', 'reporter', 'created_at', 'updated_at', 'resolved_by', 'resolved_at', 'admin_notes']
    
    def validate(self, data):
        """Validate that either place or review is provided"""
        place = data.get('place')
        review = data.get('review')
        
        if not place and not review:
            raise serializers.ValidationError({
                'error': 'يجب تحديد مكان أو مراجعة للإبلاغ عنها'
            })
        
        if place and review:
            raise serializers.ValidationError({
                'error': 'لا يمكن الإبلاغ عن مكان ومراجعة في نفس الوقت'
            })
        
        return data
    
    def create(self, validated_data):
        validated_data['reporter'] = self.context['request'].user
        return super().create(validated_data)

