from django.conf import settings
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models


class Question(models.Model):
    """Questão do banco de questões, utilizável pelo Learning Engine."""

    class Type(models.TextChoices):
        MULTIPLE_CHOICE = "multiple_choice", "Escolha múltipla"
        SHORT_ANSWER = "short_answer", "Resposta curta"
        TRUE_FALSE = "true_false", "Verdadeiro/Falso"

    statement = models.TextField("enunciado")
    course = models.ForeignKey(
        "operations.Course",
        on_delete=models.CASCADE,
        related_name="questions",
        verbose_name="disciplina",
    )
    topic = models.ForeignKey(
        "operations.Topic",
        on_delete=models.SET_NULL,
        related_name="questions",
        null=True,
        blank=True,
        verbose_name="tópico",
    )
    difficulty = models.PositiveSmallIntegerField(
        "dificuldade (1–5)",
        default=3,
        validators=[MinValueValidator(1), MaxValueValidator(5)],
    )
    question_type = models.CharField(
        "tipo", max_length=30, choices=Type.choices, default=Type.MULTIPLE_CHOICE
    )
    options = models.JSONField("opções", default=list, blank=True)
    correct_answer = models.TextField("resposta correta")
    explanation = models.TextField("explicação", blank=True)
    skills = models.JSONField("competências", default=list, blank=True)
    is_published = models.BooleanField("publicada", default=True)
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        related_name="created_questions",
        null=True,
        blank=True,
        verbose_name="criada por",
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "questão"
        verbose_name_plural = "questões"
        ordering = ["-created_at"]

    def __str__(self):
        return self.statement[:80]


class Attempt(models.Model):
    """Tentativa de um estudante numa questão (combustível do Learning Engine)."""

    student = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="attempts",
        verbose_name="estudante",
    )
    question = models.ForeignKey(
        Question, on_delete=models.CASCADE, related_name="attempts", verbose_name="questão"
    )
    answer = models.TextField("resposta", blank=True)
    is_correct = models.BooleanField("correta", default=False)
    time_spent = models.PositiveIntegerField("tempo (segundos)", default=0)
    attempt_number = models.PositiveIntegerField("número da tentativa", default=1)
    strategy = models.CharField("estratégia", max_length=100, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "tentativa"
        verbose_name_plural = "tentativas"
        ordering = ["-created_at"]

    def __str__(self):
        return f"{self.student} — {self.question} — {'OK' if self.is_correct else 'erro'}"

    @property
    def topic(self):
        return self.question.topic


class LearningProfile(models.Model):
    """Perfil de aprendizagem dinâmico de um estudante."""

    student = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="learning_profile",
        verbose_name="estudante",
    )
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = "perfil de aprendizagem"
        verbose_name_plural = "perfis de aprendizagem"

    def __str__(self):
        return f"Perfil de {self.student}"


class TopicMastery(models.Model):
    """Estimativa de domínio do estudante num tópico."""

    profile = models.ForeignKey(
        LearningProfile,
        on_delete=models.CASCADE,
        related_name="masteries",
        verbose_name="perfil",
    )
    topic = models.ForeignKey(
        "operations.Topic",
        on_delete=models.CASCADE,
        related_name="masteries",
        verbose_name="tópico",
    )
    mastery = models.FloatField(
        "domínio (0–1)", default=0.0, validators=[MinValueValidator(0.0), MaxValueValidator(1.0)]
    )
    correct_count = models.PositiveIntegerField("respostas corretas", default=0)
    incorrect_count = models.PositiveIntegerField("respostas incorretas", default=0)
    last_attempt_at = models.DateTimeField("última tentativa", null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "domínio de tópico"
        verbose_name_plural = "domínios de tópicos"
        ordering = ["mastery"]
        constraints = [
            models.UniqueConstraint(
                fields=["profile", "topic"], name="unique_profile_topic"
            )
        ]

    def __str__(self):
        return f"{self.profile.student} — {self.topic} — {self.mastery:.0%}"


class Recommendation(models.Model):
    """Recomendação gerada pelo motor de recomendação."""

    class Status(models.TextChoices):
        SUGGESTED = "suggested", "Sugerida"
        DISMISSED = "dismissed", "Ignorada"
        DONE = "done", "Concluída"

    student = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="recommendations",
        verbose_name="estudante",
    )
    question = models.ForeignKey(
        Question,
        on_delete=models.CASCADE,
        related_name="recommendations",
        null=True,
        blank=True,
        verbose_name="questão",
    )
    topic = models.ForeignKey(
        "operations.Topic",
        on_delete=models.CASCADE,
        related_name="recommendations",
        null=True,
        blank=True,
        verbose_name="tópico",
    )
    reason = models.TextField("motivo", blank=True)
    priority = models.PositiveSmallIntegerField(
        "prioridade (1 = máxima)",
        default=3,
        validators=[MinValueValidator(1), MaxValueValidator(5)],
    )
    status = models.CharField(
        "estado", max_length=20, choices=Status.choices, default=Status.SUGGESTED
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "recomendação"
        verbose_name_plural = "recomendações"
        ordering = ["priority", "-created_at"]

    def __str__(self):
        return f"{self.student} — {self.topic or self.question} — {self.reason[:50]}"
