from rest_framework import serializers
from usuarios.models import Usuario
from .models import Artigo, Comentario, Categoria, LikeArtigo, LikeComentario, Tag


class AutorResumoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Usuario
        fields = ("id", "first_name", "last_name", "email", "avatar")


class CategoriaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Categoria
        fields = "__all__"


class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = "__all__"


class ArtigoSerializer(serializers.ModelSerializer):
    likes = serializers.SerializerMethodField()
    liked = serializers.SerializerMethodField()
    autor = AutorResumoSerializer(read_only=True)
    categoria = CategoriaSerializer(read_only=True)
    categoria_id = serializers.PrimaryKeyRelatedField(
        queryset=Categoria.objects.all(),
        source="categoria",
        write_only=True,
        required=False,
        allow_null=True,
    )
    tags = TagSerializer(many=True, read_only=True)
    tag_ids = serializers.PrimaryKeyRelatedField(
        queryset=Tag.objects.all(),
        source="tags",
        many=True,
        write_only=True,
        required=False,
    )

    class Meta:
        model = Artigo
        fields = (
            "id",
            "thumbnail",
            "autor",
            "titulo",
            "categoria",
            "categoria_id",
            "tags",
            "tag_ids",
            "conteudo",
            "tempo_leitura",
            "video",
            "audio",
            "is_artigo_picante",
            "visualizacoes",
            "data_criacao",
            "likes",
            "liked",
        )

    def get_likes(self, obj):
        return obj.likeartigo_set.count()

    def get_liked(self, obj):
        request = self.context.get("request")
        user = getattr(request, "user", None)
        if not user or not user.is_authenticated:
            return False
        return LikeArtigo.objects.filter(usuario=user, artigo=obj).exists()

class ComentarioSerializer(serializers.ModelSerializer):
    respostas = serializers.SerializerMethodField()
    likes = serializers.SerializerMethodField()
    liked = serializers.SerializerMethodField()
    autor = AutorResumoSerializer(read_only=True)

    class Meta:
        model = Comentario
        fields = (
            "id",
            "autor",
            "artigo",
            "texto",
            "resposta",
            "data_criacao",
            "respostas",
            "likes",
            "liked",
        )

    def get_respostas(self, obj):
        return ComentarioSerializer(obj.respostas.all(), many=True, context=self.context).data

    def get_likes(self, obj):
        return obj.likecomentario_set.count()

    def get_liked(self, obj):
        request = self.context.get("request")
        user = getattr(request, "user", None)
        if not user or not user.is_authenticated:
            return False
        return LikeComentario.objects.filter(usuario=user, comentario=obj).exists()
