from rest_framework import serializers
from .models import (
    BlogCategory,
    BlogSEO,
    BlogTag,
    BlogPost,
)


class BlogCategorySerializer(serializers.ModelSerializer):

    posts = serializers.IntegerField(
        source="posts.count",
        read_only=True,
    )

    class Meta:
        model = BlogCategory
        fields = [
            "id",
            "name",
            "slug",
            "posts",
            "description",
            "is_active",
        ]

class BlogTagSerializer(serializers.ModelSerializer):

    class Meta:
        model = BlogTag

        fields = [
            "id",
            "name",
            "slug",
        ]

class BlogSEOSerializer(serializers.ModelSerializer):

    class Meta:
        model = BlogSEO

        fields = "__all__"


class BlogListSerializer(serializers.ModelSerializer):

    category = BlogCategorySerializer(read_only=True)

    tags = BlogTagSerializer(many=True, read_only=True)

    reading_time = serializers.SerializerMethodField()

    author_name = serializers.SerializerMethodField()

    class Meta:
        model = BlogPost

        fields = [
            "id",
            "title",
            "slug",
            "excerpt",
            "featured_image",
            "published_at",
            "is_featured",
            "reading_time",
            "author_name",
            "category",
            "tags",
            "likes_count",
            "views_count",
        ]

    def get_reading_time(self, obj):
        return obj.reading_time

    def get_author_name(self, obj):
        return obj.author.get_full_name()

class BlogDetailSerializer(serializers.ModelSerializer):

    category = BlogCategorySerializer(
        read_only=True
    )

    tags = BlogTagSerializer(
        many=True,
        read_only=True
    )

    seo = BlogSEOSerializer(
        read_only=True
    )

    reading_time = serializers.SerializerMethodField()

    class Meta:
        model = BlogPost

        fields = "__all__"

    def get_reading_time(self, obj):
        return obj.reading_time