from rest_framework import serializers
from .models import Category, News, ImageGallery


class CategorySerializer(serializers.ModelSerializer):
    """Serializer for Category model"""
    news_count = serializers.SerializerMethodField()
    featured_image = serializers.SerializerMethodField()

    class Meta:
        model = Category
        fields = ['id', 'name', 'slug', 'description', 'featured_image', 'news_count', 'created_at', 'updated_at']
        read_only_fields = ['slug', 'created_at', 'updated_at']

    def get_news_count(self, obj):
        """Return the count of active news items in this category"""
        return obj.news_items.filter(is_active=True).count()

    def get_featured_image(self, obj):
        """Return absolute URL for category featured image or None"""
        request = self.context.get('request')
        if obj.featured_image:
            try:
                url = obj.featured_image.url
            except ValueError:
                return None
            if request:
                return request.build_absolute_uri(url)
            return url
        return None


class ImageGallerySerializer(serializers.ModelSerializer):
    """Serializer for ImageGallery model"""
    
    class Meta:
        model = ImageGallery
        fields = ['id', 'image', 'caption', 'order', 'uploaded_at']
        read_only_fields = ['uploaded_at']


class NewsListSerializer(serializers.ModelSerializer):
    """Serializer for News list view (summary)"""
    category_name = serializers.CharField(source='category.name', read_only=True)
    category_slug = serializers.CharField(source='category.slug', read_only=True)
    featured_image = serializers.SerializerMethodField()
    category_featured_image = serializers.SerializerMethodField()
    
    class Meta:
        model = News
        fields = [
            'id', 'title', 'slug', 'short_description', 
            'category', 'category_name', 'category_slug',
            'publish_date', 'featured_image', 'category_featured_image', 'is_active'
        ]
        read_only_fields = ['slug']
    
    def get_featured_image(self, obj):
        """Return featured image URL or default placeholder"""
        request = self.context.get('request')
        return obj.get_featured_image_url(request)

    def get_category_featured_image(self, obj):
        """Return category featured image URL if available"""
        request = self.context.get('request')
        cat = obj.category
        if cat and cat.featured_image:
            try:
                url = cat.featured_image.url
            except ValueError:
                return None
            if request:
                return request.build_absolute_uri(url)
            return url
        return None


class NewsDetailSerializer(serializers.ModelSerializer):
    """Serializer for News detail view (full content)"""
    category_name = serializers.CharField(source='category.name', read_only=True)
    category_slug = serializers.CharField(source='category.slug', read_only=True)
    gallery_images = ImageGallerySerializer(many=True, read_only=True)
    featured_image = serializers.SerializerMethodField()
    category_featured_image = serializers.SerializerMethodField()
    
    class Meta:
        model = News
        fields = [
            'id', 'title', 'slug', 'short_description', 'description',
            'category', 'category_name', 'category_slug',
            'publish_date', 'featured_image', 'category_featured_image', 'is_active',
            'gallery_images', 'created_at', 'updated_at'
        ]
        read_only_fields = ['slug', 'created_at', 'updated_at']
    
    def get_featured_image(self, obj):
        """Return featured image URL or default placeholder"""
        request = self.context.get('request')
        return obj.get_featured_image_url(request)

    def get_category_featured_image(self, obj):
        request = self.context.get('request')
        cat = obj.category
        if cat and cat.featured_image:
            try:
                url = cat.featured_image.url
            except ValueError:
                return None
            if request:
                return request.build_absolute_uri(url)
            return url
        return None


class NewsCreateUpdateSerializer(serializers.ModelSerializer):
    """Serializer for creating/updating News"""
    gallery_images = ImageGallerySerializer(many=True, read_only=True)
    featured_image_url = serializers.SerializerMethodField(read_only=True)
    
    class Meta:
        model = News
        fields = [
            'id', 'title', 'slug', 'short_description', 'description',
            'category', 'publish_date', 'featured_image', 'featured_image_url', 'is_active',
            'gallery_images'
        ]
        read_only_fields = ['slug', 'featured_image_url']
    
    def get_featured_image_url(self, obj):
        """Return featured image URL or default placeholder"""
        request = self.context.get('request')
        return obj.get_featured_image_url(request)

    def validate_title(self, value):
        """Ensure title is not empty"""
        if not value.strip():
            raise serializers.ValidationError("Title cannot be empty")
        return value
