"""
analytics/models.py
====================
Modelos para analítica pedagógica.
Los datos se calculan a partir de Respuesta y DudaAlumno,
estos modelos almacenan alertas y snapshots pre-calculados
para no recalcular en cada request.
"""

from django.db import models
from django.conf import settings
from shared.mixins import TimestampedModel
from academic.models import Seccion
from sessions.models import Sesion


class AlertaRiesgo(TimestampedModel):
    """
    Alerta generada automáticamente para alumnos en riesgo pedagógico.
    Se genera al cerrar cada sesión si el alumno cumple los criterios:
      - Participación < 30% en las últimas 3 sesiones
      - Tasa de acierto < 35% en las últimas 3 sesiones
    """

    class Nivel(models.TextChoices):
        BAJO  = 'bajo',  'Bajo'
        MEDIO = 'medio', 'Medio'
        ALTO  = 'alto',  'Alto'

    alumno  = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='alertas_riesgo'
    )
    seccion = models.ForeignKey(Seccion, on_delete=models.CASCADE, related_name='alertas_riesgo')
    nivel   = models.CharField(max_length=5, choices=Nivel.choices)
    participacion_pct = models.FloatField(verbose_name='% participación promedio')
    precision_pct     = models.FloatField(verbose_name='% acierto promedio')
    sesiones_analizadas = models.PositiveSmallIntegerField()
    activa  = models.BooleanField(default=True, verbose_name='Alerta activa')

    class Meta(TimestampedModel.Meta):
        verbose_name = 'Alerta de riesgo'
        db_table = 'analytics_alertariesgo'
        ordering = ['-created_at']

    def __str__(self):
        return f'Riesgo {self.nivel}: alumno {self.alumno_id} en {self.seccion}'


class ConceptoConfuso(TimestampedModel):
    """
    Concepto frecuentemente mal respondido o mencionado en reflexiones.
    Permite generar la nube de conceptos confusos del módulo analítico.
    """
    seccion   = models.ForeignKey(Seccion, on_delete=models.CASCADE, related_name='conceptos_confusos')
    sesion    = models.ForeignKey(Sesion, null=True, on_delete=models.SET_NULL, related_name='conceptos_confusos')
    concepto  = models.CharField(max_length=200)
    frecuencia = models.PositiveSmallIntegerField(default=1)

    class Meta(TimestampedModel.Meta):
        verbose_name = 'Concepto confuso'
        db_table = 'analytics_conceptoconfuso'
        unique_together = [['seccion', 'concepto']]
