from rest_framework import serializers
from django.contrib.contenttypes.models import ContentType
from .models import Rating

class RatingSerializer(serializers.ModelSerializer):
    user = serializers.StringRelatedField(read_only=True)
    model_name = serializers.CharField(write_only=True)  # Örn: 'product'
    object_id = serializers.IntegerField()

    class Meta:
        model = Rating
        fields = ['id', 'score', 'comment', 'user', 'created_at', 'model_name', 'object_id']
        read_only_fields = ['id', 'created_at', 'user']

    def create(self, validated_data):
        model_name = validated_data.pop('model_name').lower()
        object_id = validated_data.pop('object_id')
        user = self.context['request'].user

        # Model adından ContentType'ı bul
        try:
            # app_label='product' varsayımı yapıyoruz veya tüm app'lerde arayabiliriz.
            # Daha güvenli olması için app_label'ı da parametre alabiliriz ama şimdilik basit tutalım.
            # Genellikle model isimleri unique olur.
            content_type = ContentType.objects.get(model=model_name)
        except ContentType.DoesNotExist:
            raise serializers.ValidationError(f"Model '{model_name}' bulunamadı.")

        # Kullanıcının daha önce oy verip vermediğini kontrol et (unique_together constraint var ama burada da yakalayalım)
        rating, created = Rating.objects.update_or_create(
            content_type=content_type,
            object_id=object_id,
            user=user,
            defaults={'score': validated_data.get('score'), 'comment': validated_data.get('comment')}
        )
        
        return rating
