"""
evaluation/models.py
=====================
Modelos de evaluación académica.

Separado de gamification porque la evaluación es formal (notas reales)
mientras que gamification es informal (puntos, insignias).
Un docente puede asignar décimas basadas en el ranking sin que
eso afecte directamente la lógica de gamificación.
"""

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

from shared.mixins import TimestampedModel
from academic.models import Seccion, Asignatura
from gamification.models import Temporada


class NotaAsignada(TimestampedModel):
    """
    Nota o décima asignada por el docente a un alumno.
    Puede ser de cualquier tipo: décima, nota parcial, bonificación.
    Se puede exportar en actas Excel/PDF.
    """

    class Tipo(models.TextChoices):
        DECIMA      = 'decima',      'Décima (+0.1)'
        NOTA_PARCIAL = 'nota_parcial','Nota parcial'
        BONIFICACION = 'bonificacion','Bonificación'
        NOTA_FINAL   = 'nota_final',  'Nota de la unidad'

    alumno   = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='notas'
    )
    docente  = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='notas_asignadas'
    )
    seccion  = models.ForeignKey(
        Seccion, on_delete=models.CASCADE, related_name='notas'
    )
    temporada = models.ForeignKey(
        Temporada, null=True, blank=True, on_delete=models.SET_NULL, related_name='notas'
    )
    tipo     = models.CharField(max_length=15, choices=Tipo.choices)
    valor    = models.DecimalField(
        max_digits=4, decimal_places=1,
        validators=[MinValueValidator(0), MaxValueValidator(7)],
        verbose_name='Valor de la nota'
    )
    criterio = models.CharField(
        max_length=300,
        verbose_name='Criterio de asignación',
        help_text='Ej: "Top 1 Temporada Unidad 2 — Felipe Mora"'
    )

    class Meta(TimestampedModel.Meta):
        verbose_name = 'Nota asignada'
        verbose_name_plural = 'Notas asignadas'
        db_table = 'evaluation_notaasignada'

    def __str__(self):
        return f'{self.tipo} {self.valor} → alumno {self.alumno_id}'


class Acta(TimestampedModel):
    """
    Acta de cierre de una temporada con las notas exportadas.
    Se genera automáticamente al cerrar una temporada
    o manualmente desde el módulo de evaluación.
    """

    class Formato(models.TextChoices):
        EXCEL = 'xlsx', 'Excel (.xlsx)'
        PDF   = 'pdf',  'PDF'

    seccion   = models.ForeignKey(Seccion, on_delete=models.CASCADE, related_name='actas')
    temporada = models.ForeignKey(
        Temporada, null=True, blank=True, on_delete=models.SET_NULL, related_name='actas'
    )
    formato   = models.CharField(max_length=4, choices=Formato.choices, default=Formato.EXCEL)
    archivo   = models.FileField(upload_to='actas/', null=True, blank=True)
    generado_por = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='actas_generadas'
    )

    class Meta(TimestampedModel.Meta):
        verbose_name = 'Acta'
        db_table = 'evaluation_acta'
