"""Sérialiseurs DRF pour l'API Blog."""
from __future__ import annotations

from rest_framework import serializers

from .models import Comment, Post


class CommentSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source="author.username", read_only=True)

    class Meta:
        model = Comment
        fields = ["id", "content", "author_name", "created_at"]
        read_only_fields = ["created_at"]

    def create(self, validated_data: dict) -> Comment:
        # Injecter l'auteur depuis le contexte de la requête
        validated_data["author"] = self.context["request"].user
        return super().create(validated_data)


class PostSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source="author.username", read_only=True)
    comment_count = serializers.IntegerField(read_only=True, default=0)
    comments = CommentSerializer(many=True, read_only=True)

    class Meta:
        model = Post
        fields = [
            "id", "title", "slug", "content", "status",
            "author_name", "comment_count", "comments",
            "published_at", "created_at",
        ]
        read_only_fields = ["slug", "created_at", "published_at", "author_name"]

    def validate_title(self, value: str) -> str:
        value = value.strip()
        if len(value) < 5:
            raise serializers.ValidationError("Le titre doit faire au moins 5 caractères")
        return value

    def validate(self, attrs: dict) -> dict:
        if attrs.get("status") == "published" and not attrs.get("content", "").strip():
            raise serializers.ValidationError({"content": "Un post publié doit avoir un contenu"})
        return attrs

    def create(self, validated_data: dict) -> Post:
        validated_data["author"] = self.context["request"].user
        return super().create(validated_data)
