from rest_framework import serializers
from .models import PromotionSlot, ProductPromotion, SponsoredAd
from products.serializers import ProductSerializer


class PromotionSlotSerializer(serializers.ModelSerializer):
    """Serializer for promotion slots"""
    current_count = serializers.ReadOnlyField()
    is_available = serializers.ReadOnlyField()
    slot_type_display = serializers.CharField(source='get_slot_type_display', read_only=True)

    class Meta:
        model = PromotionSlot
        fields = [
            'id', 'slot_type', 'slot_type_display', 'name', 'description',
            'price', 'duration_hours', 'max_products', 'is_active',
            'current_count', 'is_available', 'created_at'
        ]
        read_only_fields = ['id', 'created_at']


class ProductPromotionSerializer(serializers.ModelSerializer):
    """Serializer for product promotions"""
    product_info = serializers.SerializerMethodField()
    slot_info = serializers.SerializerMethodField()
    is_expired = serializers.ReadOnlyField()
    is_currently_active = serializers.ReadOnlyField()

    class Meta:
        model = ProductPromotion
        fields = [
            'id', 'product', 'product_info', 'slot', 'slot_info', 'vendor',
            'starts_at', 'ends_at', 'is_active', 'is_expired', 'is_currently_active',
            'created_at'
        ]
        read_only_fields = ['id', 'vendor', 'starts_at', 'ends_at', 'created_at']

    def get_product_info(self, obj):
        return {
            'id': obj.product.id,
            'uuid': str(obj.product.uuid),
            'name': obj.product.name,
            'price': str(obj.product.price),
            'primary_image': obj.product.primary_image.url if obj.product.primary_image else None,
        }

    def get_slot_info(self, obj):
        return {
            'id': obj.slot.id,
            'name': obj.slot.name,
            'slot_type': obj.slot.slot_type,
            'price': str(obj.slot.price),
        }


class PromotedProductSerializer(serializers.ModelSerializer):
    """Serializer for displaying promoted products"""
    product = ProductSerializer(read_only=True)
    promotion_type = serializers.CharField(source='slot.slot_type', read_only=True)
    ends_at = serializers.DateTimeField(read_only=True)

    class Meta:
        model = ProductPromotion
        fields = ['id', 'product', 'promotion_type', 'ends_at']


class SponsoredAdSerializer(serializers.ModelSerializer):
    """Serializer for sponsored ads"""
    item_info = serializers.SerializerMethodField()
    item_name = serializers.ReadOnlyField()
    is_currently_active = serializers.ReadOnlyField()
    is_expired = serializers.ReadOnlyField()
    ctr = serializers.ReadOnlyField()
    status = serializers.SerializerMethodField()

    class Meta:
        model = SponsoredAd
        fields = [
            'id', 'item_type', 'item_name', 'item_info', 'days', 'total_cost',
            'impressions', 'clicks', 'ctr', 'starts_at', 'ends_at',
            'is_active', 'is_currently_active', 'is_expired', 'status',
            'created_at'
        ]
        read_only_fields = ['id', 'impressions', 'clicks', 'created_at']

    def _build_url(self, field):
        request = self.context.get('request')
        if field and request:
            return request.build_absolute_uri(field.url)
        elif field:
            return field.url
        return None

    def _get_product_info(self, obj):
        product = obj.product
        if not product:
            return None
        return {
            'id': product.id,
            'uuid': str(product.uuid),
            'name': product.name,
            'slug': product.slug if hasattr(product, 'slug') else None,
            'price': str(product.price),
            'primary_image': self._build_url(product.primary_image),
            'category': product.category,
            'shop_name': obj.vendor.shop_name,
            'shop_logo': self._build_url(obj.vendor.shop_logo),
            'vendor_slug': obj.vendor.slug,
            'location': obj.vendor.town_area,
        }

    def _get_service_info(self, obj):
        service = obj.service
        if not service:
            return None
        return {
            'id': service.id,
            'name': service.name,
            'slug': service.slug,
            'price': str(service.price) if service.price else None,
            'price_type': service.price_type,
            'category': service.category,
            'image': self._build_url(service.image),
            'shop_name': obj.vendor.shop_name,
            'shop_logo': self._build_url(obj.vendor.shop_logo),
            'vendor_slug': obj.vendor.slug,
            'location': obj.vendor.town_area,
        }

    def _get_event_info(self, obj):
        event = obj.event
        if not event:
            return None
        return {
            'id': event.id,
            'title': event.title,
            'slug': event.slug,
            'category': event.category,
            'date': str(event.date) if event.date else None,
            'venue': event.venue,
            'county': event.county,
            'is_free': event.is_free,
            'image': self._build_url(event.image),
            'shop_name': obj.vendor.shop_name,
            'shop_logo': self._build_url(obj.vendor.shop_logo),
            'vendor_slug': obj.vendor.slug,
            'location': obj.vendor.town_area,
        }

    def _get_menu_info(self, obj):
        menu = obj.menu
        if not menu:
            return None
        return {
            'id': menu.id,
            'name': menu.name,
            'slug': menu.slug,
            'menu_type': menu.menu_type,
            'logo': self._build_url(menu.logo),
            'cover_image': self._build_url(menu.cover_image),
            'shop_name': obj.vendor.shop_name,
            'shop_logo': self._build_url(obj.vendor.shop_logo),
            'vendor_slug': obj.vendor.slug,
            'location': obj.vendor.town_area,
        }

    def _get_video_info(self, obj):
        video = obj.video
        if not video:
            return None
        return {
            'id': video.id,
            'title': video.title,
            'slug': video.slug,
            'thumbnail': self._build_url(video.thumbnail),
            'price_min': str(video.price_min) if video.price_min else None,
            'price_max': str(video.price_max) if video.price_max else None,
            'category': video.category,
            'views_count': video.views_count,
            'likes_count': video.likes_count,
            'shop_name': obj.vendor.shop_name,
            'shop_logo': self._build_url(obj.vendor.shop_logo),
            'vendor_slug': obj.vendor.slug,
        }

    def get_item_info(self, obj):
        if obj.item_type == 'product':
            return self._get_product_info(obj)
        elif obj.item_type == 'service':
            return self._get_service_info(obj)
        elif obj.item_type == 'event':
            return self._get_event_info(obj)
        elif obj.item_type == 'menu':
            return self._get_menu_info(obj)
        elif obj.item_type == 'video':
            return self._get_video_info(obj)
        return None

    def get_status(self, obj):
        if obj.is_expired:
            return 'expired'
        if obj.is_currently_active:
            return 'active'
        return 'inactive'
