from rest_framework import serializers
from .models import Market, MarketVendor


class MarketListSerializer(serializers.ModelSerializer):
    logo_url = serializers.SerializerMethodField()
    is_vendor_member = serializers.SerializerMethodField()

    class Meta:
        model = Market
        fields = [
            'id', 'name', 'slug', 'logo_url', 'description',
            'category', 'county', 'town_area', 'status', 'featured',
            'vendor_approval', 'vendors_count', 'products_count',
            'is_vendor_member', 'created_at',
        ]

    def get_logo_url(self, obj):
        if obj.logo:
            request = self.context.get('request')
            if request:
                return request.build_absolute_uri(obj.logo.url)
            return obj.logo.url
        return None

    def get_is_vendor_member(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated and request.user.user_type == 'vendor':
            return obj.vendors.filter(vendor=request.user, status__in=['active', 'pending']).exists()
        return False


class MarketDetailSerializer(serializers.ModelSerializer):
    logo_url = serializers.SerializerMethodField()
    cover_image_url = serializers.SerializerMethodField()
    is_vendor_member = serializers.SerializerMethodField()
    vendor_status = serializers.SerializerMethodField()

    class Meta:
        model = Market
        fields = [
            'id', 'name', 'slug', 'logo_url', 'cover_image_url',
            'description', 'category', 'county', 'town_area',
            'status', 'featured', 'vendor_approval',
            'vendors_count', 'products_count',
            'is_vendor_member', 'vendor_status',
            'created_at', 'updated_at',
        ]

    def get_logo_url(self, obj):
        if obj.logo:
            request = self.context.get('request')
            if request:
                return request.build_absolute_uri(obj.logo.url)
            return obj.logo.url
        return None

    def get_cover_image_url(self, obj):
        if obj.cover_image:
            request = self.context.get('request')
            if request:
                return request.build_absolute_uri(obj.cover_image.url)
            return obj.cover_image.url
        return None

    def get_is_vendor_member(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated and request.user.user_type == 'vendor':
            return obj.vendors.filter(vendor=request.user, status='active').exists()
        return False

    def get_vendor_status(self, obj):
        request = self.context.get('request')
        if request and request.user.is_authenticated and request.user.user_type == 'vendor':
            mv = obj.vendors.filter(vendor=request.user).first()
            return mv.status if mv else None
        return None


class MarketVendorSerializer(serializers.ModelSerializer):
    vendor_id = serializers.IntegerField(source='vendor.id', read_only=True)
    vendor_name = serializers.CharField(source='vendor.full_name', read_only=True)
    vendor_photo = serializers.SerializerMethodField()
    shop_logo = serializers.SerializerMethodField()
    shop_name = serializers.SerializerMethodField()
    shop_slug = serializers.SerializerMethodField()
    shop_category = serializers.SerializerMethodField()
    products_count = serializers.SerializerMethodField()
    followers_count = serializers.SerializerMethodField()
    rating = serializers.SerializerMethodField()
    is_verified_vendor = serializers.SerializerMethodField()

    class Meta:
        model = MarketVendor
        fields = [
            'id', 'vendor_id', 'vendor_name', 'vendor_photo', 'shop_logo',
            'shop_name', 'shop_slug', 'shop_category',
            'status', 'products_count', 'followers_count',
            'rating', 'is_verified_vendor', 'joined_at',
        ]

    def get_vendor_photo(self, obj):
        if obj.vendor.profile_photo:
            request = self.context.get('request')
            if request:
                return request.build_absolute_uri(obj.vendor.profile_photo.url)
            return obj.vendor.profile_photo.url
        return None

    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_name(self, obj):
        try:
            return obj.vendor.vendor_profile.shop_name
        except Exception:
            return obj.vendor.full_name

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

    def get_shop_category(self, obj):
        try:
            return obj.vendor.vendor_profile.shop_category
        except Exception:
            return ''

    def get_products_count(self, obj):
        try:
            return obj.vendor.vendor_profile.products.filter(status='active').count()
        except Exception:
            return 0

    def get_followers_count(self, obj):
        try:
            from accounts.models import Follow
            return Follow.objects.filter(vendor=obj.vendor).count()
        except Exception:
            return 0

    def get_rating(self, obj):
        try:
            return float(obj.vendor.vendor_profile.rating or 0)
        except Exception:
            return 0

    def get_is_verified_vendor(self, obj):
        try:
            return obj.vendor.vendor_profile.is_verified_vendor
        except Exception:
            return False
