from django.db import models
from django.core.exceptions import ValidationError

class Alumno(models.Model):
    # Definimos las opciones de los estados para tenerlos bien controlados
    class EstadoTramite(models.IntegerChoices):
        SOLICITUD = 1, 'Solicitud de la titulación'
        REVISION = 2, 'Armado y Revisión del expediente'
        PAGO = 3, 'Pago (en caso de ser necesario)'
        AUTENTICACION_SEC = 4, 'Autenticación de documentos por parte de la SEC'
        CEDULA_SEC = 5, 'Antecedente y Cédula por parte de la SEC'
        INSUMOS_LISTOS = 6, 'Documentacion Lista para Entrega'
        FIN = 7, 'Documentacion Entregada'

    class ModoTitulacion(models.TextChoices):
        PROMEDIO = 'Promedio', 'Promedio'
        TESIS = 'Tesis', 'Tesis'
        TESISINA = 'Tesina', 'Tesina'
        CURSOS = 'Cursos de titulación', 'Cursos de titulación'
        DIPLOMADO = 'Diplomado', 'Diplomado'
        GRADO = 'Titulación por Estudio de Grado Superior Inmediato'
        
    # Datos del alumno
    matricula = models.CharField('Matrícula', max_length=20, unique=True)
    nombre = models.CharField('Nombre Completo', max_length=150)
    correo = models.EmailField('Correo Electrónico', max_length=254, blank=True, default='')
    
    modo_titulacion = models.CharField(
        'Modo de Titulación', 
        max_length=50,
        choices=ModoTitulacion.choices,
        default=ModoTitulacion.PROMEDIO
    )
    
    generacion = models.IntegerField('Generación', help_text="Ejemplo: 60", null=True, blank=True)
    
    # Datos del trámite
    paga_titulacion = models.BooleanField('¿Paga titulación?', default=True)
    
    # Aquí enlazamos las opciones que creamos arriba
    estado_actual = models.IntegerField(
        'Estado Actual', 
        choices=EstadoTramite.choices, 
        default=EstadoTramite.SOLICITUD
    )
    
    # Insumos y Finalización
    titulo_listo = models.BooleanField('Título Listo', default=False)
    cedula_lista = models.BooleanField('Cédula Lista', default=False)
    
    # NUEVO CAMPO: Cita para recoger el título
    fecha_cita = models.DateTimeField(
        'Fecha y Hora de Cita', 
        null=True, 
        blank=True, 
        help_text="Asignar solo cuando el título esté listo para entrega."
    )

    def clean(self):
        # Primero ejecuta las validaciones normales de Django
        super().clean()
        
        # Regla de negocio 1: Si NO paga titulación, su estado no puede ser "PAGO" (3)
        if not self.paga_titulacion and self.estado_actual == self.EstadoTramite.PAGO:
            raise ValidationError({
                'estado_actual': 'Error: Un alumno exento de pago no puede estar en el estado "Pago".'
            })
            
        # Regla de negocio 2 (Opcional pero recomendada): Validar que no haya cita si no están listos los insumos
        if self.fecha_cita and self.estado_actual < self.EstadoTramite.INSUMOS_LISTOS:
            raise ValidationError({
                'fecha_cita': 'Error: No se puede asignar una cita si el trámite no está en "Insumos Listos" o "Fin".'
            })

    def __str__(self):
        return f"{self.matricula} - {self.nombre}"