from rest_framework import serializers

from learning.models import Attempt, LearningProfile, Question, Recommendation, TopicMastery


class QuestionSerializer(serializers.ModelSerializer):
    course_name = serializers.CharField(source="course.name", read_only=True)
    topic_name = serializers.CharField(source="topic.name", read_only=True)

    class Meta:
        model = Question
        fields = [
            "id",
            "statement",
            "course",
            "course_name",
            "topic",
            "topic_name",
            "difficulty",
            "question_type",
            "options",
            "correct_answer",
            "explanation",
            "skills",
            "is_published",
            "created_at",
        ]
        read_only_fields = ["id", "created_at"]


class AttemptSerializer(serializers.ModelSerializer):
    question_statement = serializers.CharField(
        source="question.statement", read_only=True
    )
    topic_name = serializers.CharField(source="question.topic.name", read_only=True)

    class Meta:
        model = Attempt
        fields = [
            "id",
            "question",
            "question_statement",
            "topic_name",
            "answer",
            "is_correct",
            "time_spent",
            "attempt_number",
            "strategy",
            "created_at",
        ]
        read_only_fields = ["id", "is_correct", "attempt_number", "created_at"]

    def validate(self, attrs):
        question = attrs.get("question")
        if question and not question.is_published:
            raise serializers.ValidationError("Esta questão não está disponível.")
        return attrs


class TopicMasterySerializer(serializers.ModelSerializer):
    topic_name = serializers.CharField(source="topic.name", read_only=True)
    course_name = serializers.CharField(source="topic.course.name", read_only=True)

    class Meta:
        model = TopicMastery
        fields = [
            "id",
            "topic",
            "topic_name",
            "course_name",
            "mastery",
            "correct_count",
            "incorrect_count",
            "last_attempt_at",
        ]
        read_only_fields = fields


class LearningProfileSerializer(serializers.ModelSerializer):
    masteries = TopicMasterySerializer(many=True, read_only=True)

    class Meta:
        model = LearningProfile
        fields = ["id", "student", "updated_at", "masteries"]
        read_only_fields = fields


class RecommendationSerializer(serializers.ModelSerializer):
    topic_name = serializers.CharField(source="topic.name", read_only=True)
    question_statement = serializers.CharField(
        source="question.statement", read_only=True
    )

    class Meta:
        model = Recommendation
        fields = [
            "id",
            "topic",
            "topic_name",
            "question",
            "question_statement",
            "reason",
            "priority",
            "status",
            "created_at",
        ]
        read_only_fields = ["id", "created_at"]
