from rest_framework import serializers
from blogs.models import Blog


class BlogListSerializer(serializers.ModelSerializer):
    """
    Serializer for blog list view (light version)
    """
    author_name = serializers.CharField(source='author.get_full_name', read_only=True)
    
    class Meta:
        model = Blog
        fields = ('slug', 'title', 'thumbnail_image', 'excerpt', 'tags', 'author_name', 
                  'is_featured', 'published_at', 'created_at')
        read_only_fields = ('slug', 'created_at', 'published_at')


class BlogDetailSerializer(serializers.ModelSerializer):
    """
    Serializer for blog detail view (full version with all SEO fields)
    """
    author_name = serializers.CharField(source='author.get_full_name', read_only=True)
    
    class Meta:
        model = Blog
        fields = ('slug', 'title', 'content', 'thumbnail_image', 'featured_image', 
                  'meta_title', 'meta_description', 'tags',
                  'og_title', 'og_description', 'og_image',
                  'author_name', 'is_featured', 'is_published', 
                  'published_at', 'created_at', 'updated_at')
        read_only_fields = ('slug', 'created_at', 'updated_at', 'published_at')


class BlogCreateUpdateSerializer(serializers.ModelSerializer):
    """
    Serializer for creating and updating blogs (admin only)
    """
    class Meta:
        model = Blog
        fields = ('slug', 'title', 'content', 'thumbnail_image', 'featured_image', 
                  'meta_title', 'meta_description', 'tags',
                  'og_title', 'og_description', 'og_image',
                  'is_featured', 'is_published')
    
    def validate_meta_title(self, value):
        if len(value) > 100:
            raise serializers.ValidationError("Meta title must be 60 characters or less.")
        return value
    
    def validate_meta_description(self, value):
        if len(value) > 200:
            raise serializers.ValidationError("Meta description must be 160 characters or less.")
        return value
