from rest_framework import serializers
from .models import Service, ServiceLike, ServiceSave


class ServiceSerializer(serializers.ModelSerializer):
    """Basic service serializer for listing"""
    vendor_name = serializers.CharField(source='vendor.shop_name', read_only=True)
    vendor_slug = serializers.CharField(source='vendor.slug', read_only=True)
    vendor_county = serializers.CharField(source='vendor.user.county', read_only=True)
    shop_name = serializers.CharField(source='vendor.shop_name', read_only=True)
    shop_logo = serializers.ImageField(source='vendor.shop_logo', read_only=True)
    is_verified_vendor = serializers.BooleanField(source='vendor.is_verified_vendor', read_only=True)
    is_upgraded = serializers.BooleanField(source='vendor.is_upgraded', read_only=True)
    likes_count = serializers.SerializerMethodField()
    is_liked = serializers.SerializerMethodField()
    is_saved = serializers.SerializerMethodField()
    is_sponsored = serializers.SerializerMethodField()
    rating = serializers.DecimalField(source='vendor.rating', max_digits=2, decimal_places=1, read_only=True)

    class Meta:
        model = Service
        fields = [
            'id', 'name', 'slug', 'category', 'description',
            'price_type', 'price', 'max_price', 'duration',
            'service_area', 'service_type', 'image', 'video',
            'status', 'views', 'likes_count',
            'vendor_name', 'vendor_slug', 'vendor_county',
            'shop_name', 'shop_logo', 'is_verified_vendor', 'is_upgraded',
            'is_liked', 'is_saved', 'is_sponsored', 'rating',
            'created_at', 'updated_at',
        ]
        read_only_fields = ['id', 'slug', 'views', 'created_at', 'updated_at']

    def get_likes_count(self, obj):
        return obj.likes.count()

    def get_is_liked(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated:
            return ServiceLike.objects.filter(user=request.user, service=obj).exists()
        return False

    def get_is_saved(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated:
            return ServiceSave.objects.filter(user=request.user, service=obj).exists()
        return False

    def get_is_sponsored(self, obj):
        return getattr(obj, 'is_sponsored', False)


class ServiceDetailSerializer(ServiceSerializer):
    """Detailed service serializer with full vendor info"""

    class Meta(ServiceSerializer.Meta):
        fields = ServiceSerializer.Meta.fields + ['vendor']

    def get_fields(self):
        fields = super().get_fields()
        from accounts.serializers import VendorProfileSerializer
        fields['vendor'] = VendorProfileSerializer(read_only=True)
        return fields


class ServiceCreateSerializer(serializers.ModelSerializer):
    """Serializer for creating services"""

    class Meta:
        model = Service
        fields = [
            'name', 'category', 'description', 'price_type',
            'price', 'max_price', 'duration', 'service_area',
            'service_type', 'image', 'video', 'status',
        ]

    def validate(self, data):
        request = self.context.get('request')
        vendor_profile = request.user.vendor_profile

        if not vendor_profile.can_add_service:
            raise serializers.ValidationError(
                "You have reached the maximum number of services. Please upgrade to add more."
            )

        if not vendor_profile.is_upgraded and data.get('video'):
            raise serializers.ValidationError(
                "Video upload is only available for upgraded vendors."
            )

        return data

    def create(self, validated_data):
        request = self.context.get('request')
        vendor_profile = request.user.vendor_profile

        service = Service.objects.create(
            vendor=vendor_profile,
            **validated_data
        )

        vendor_profile.total_services = Service.objects.filter(
            vendor=vendor_profile
        ).exclude(status='deleted').count()
        vendor_profile.save()

        return service


class ServiceUpdateSerializer(serializers.ModelSerializer):
    """Serializer for updating services"""

    class Meta:
        model = Service
        fields = [
            'name', 'category', 'description', 'price_type',
            'price', 'max_price', 'duration', 'service_area',
            'service_type', 'image', 'video', 'status',
        ]

    def validate(self, data):
        request = self.context.get('request')
        vendor_profile = request.user.vendor_profile

        if not vendor_profile.is_upgraded and data.get('video'):
            raise serializers.ValidationError(
                "Video upload is only available for upgraded vendors."
            )

        return data

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            setattr(instance, attr, value)
        instance.save()
        return instance
