from rest_framework import serializers
from .models import VideoListing, VideoReview


class VideoListingSerializer(serializers.ModelSerializer):
    shop_name = serializers.SerializerMethodField()
    shop_logo = serializers.SerializerMethodField()
    shop_slug = serializers.SerializerMethodField()
    vendor_id = serializers.IntegerField(source='vendor.id', read_only=True)
    whatsapp_number = serializers.SerializerMethodField()
    is_liked = serializers.SerializerMethodField()
    is_disliked = serializers.SerializerMethodField()
    is_wishlisted = serializers.SerializerMethodField()
    is_sponsored = serializers.SerializerMethodField()

    class Meta:
        model = VideoListing
        fields = [
            'id', 'uuid', 'title', 'slug', 'description', 'video', 'thumbnail',
            'price_min', 'price_max', 'category', 'views_count', 'likes_count',
            'dislikes_count', 'is_active', 'created_at', 'updated_at',
            'vendor_id', 'shop_name', 'shop_logo', 'shop_slug',
            'whatsapp_number', 'is_liked', 'is_disliked', 'is_wishlisted',
            'is_sponsored',
        ]
        read_only_fields = [
            'id', 'uuid', 'slug', 'views_count', 'likes_count', 'dislikes_count',
            'created_at', 'updated_at', 'vendor_id',
        ]

    def get_shop_name(self, obj):
        try:
            return obj.vendor.vendor_profile.shop_name
        except Exception:
            return obj.vendor.full_name

    def get_shop_logo(self, obj):
        try:
            logo = obj.vendor.vendor_profile.shop_logo
            if logo:
                request = self.context.get('request')
                if request:
                    return request.build_absolute_uri(logo.url)
                return logo.url
        except Exception:
            pass
        return None

    def get_shop_slug(self, obj):
        try:
            return obj.vendor.vendor_profile.slug
        except Exception:
            return ''

    def get_whatsapp_number(self, obj):
        try:
            return obj.vendor.vendor_profile.whatsapp_number
        except Exception:
            return None

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

    def get_is_disliked(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated:
            return obj.dislikes.filter(user=request.user).exists()
        return False

    def get_is_wishlisted(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated:
            return obj.wishlisted_by.filter(user=request.user).exists()
        return False

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


class VideoListingCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = VideoListing
        fields = ['title', 'description', 'video', 'thumbnail', 'price_min', 'price_max', 'category']

    def validate_video(self, value):
        if value.size > 5 * 1024 * 1024:
            raise serializers.ValidationError('Video file must be 5MB or less.')
        return value


class VideoReviewSerializer(serializers.ModelSerializer):
    buyer_name = serializers.SerializerMethodField()

    class Meta:
        model = VideoReview
        fields = ['id', 'buyer_name', 'product', 'video', 'description', 'rating', 'created_at']
        read_only_fields = ['id', 'created_at']

    def get_buyer_name(self, obj):
        return obj.buyer.full_name

    def validate_video(self, value):
        if value.size > 5 * 1024 * 1024:
            raise serializers.ValidationError('Video file must be 5MB or less.')
        return value
