from django.db import models

# Create your models here.
from datetime import date
from django.db import models
#from django.contrib.auth.models import User
from django.db.models.fields import IntegerField
from users.models import CustomUser

from datetime import datetime
from django.core.exceptions import ValidationError
from django.conf import settings




class Curso(models.Model):
    """docstring for ClassName"""
    # def id_actual():
    #     #funcion que sirve para que cuando se insertar una nueva instancia en persona aparezca el id
    #     no = int(Curso.objects.latest('id_curso'))
    #     if no == None:
    #         return 1
    #     else:
    #         return no + 1
    

    # id_curso = models.IntegerField(primary_key=True,unique=True, default= id_actual, verbose_name = 'Nro Curso')
    # nombre = models.CharField(max_length=200,blank= True,null=True, verbose_name ='Nombre')
    # anio =  models.IntegerField(blank= True,null=True, default=datetime.now().year, verbose_name= 'Año')
    # leyenda_1 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Leyenda 1')
    
    # leyenda_1_bis = models.CharField(max_length=200,blank= True,null=True, verbose_name='Solo usar cuando el texto anterior es mayor a 50 carácteres')
    def id_actual():
        # OJO: latest puede lanzar DoesNotExist si no hay cursos
        try:
            ultimo = Curso.objects.latest('id_curso')
            return int(ultimo.id_curso) + 1
        except Curso.DoesNotExist:
            return 1
        except Exception:
            # fallback ultra seguro
            return 1

    id_curso = models.IntegerField(
        primary_key=True,
        unique=True,
        default=id_actual,
        verbose_name='Nro Curso'
    )

    nombre = models.CharField(max_length=200, blank=True, null=True, verbose_name='Nombre')
    anio = models.IntegerField(blank=True, null=True, default=datetime.now().year, verbose_name='Año')

    # ✅ SUBIMOS tipo (soluciona el 1406 sin perder nada)
    # si querés mantener choices, no hay problema.
    tipo = models.CharField(max_length=80, blank=True, null=True)

    leyenda_1 = models.CharField(max_length=200, blank=True, null=True, verbose_name='Leyenda 1')
    plantilla_leyenda_dni = models.CharField(
        max_length=500,
        blank=True,
        null=True,
        verbose_name='Plantilla de la línea DNI / rol',
        help_text=(
            'Permite modificar la línea completa del diploma. '
            'Marcadores disponibles: {dni}, {leyenda_1}, {rol} y {sufijo}. '
            'Si se deja vacío, se conserva el texto tradicional de cada tipo de diploma.'
        ),
    )
    leyenda_1_bis = models.CharField(max_length=200, blank=True, null=True)
    #leyenda_1 = models.TextField(max_length=1024*2,blank= True,null=True, verbose_name='Leyenda 1')
    leyenda_2 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Leyenda 2')
    leyenda_3 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Leyenda 3')
    leyenda_4 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Leyenda 4')
    leyenda_5 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Leyenda 5')
    leyenda_6 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Leyenda 6 (Solo Revista)')
    leyenda_7 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Leyenda 7 (Solo Revista)')
    firma = models.BooleanField(default=1, blank=True, null=True, verbose_name='¿Firma?')
    leyenda_disertante_1 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Disertante 1')
    leyenda_disertante_2 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Disertante 2')
    leyenda_disertante_3 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Disertante 3')
    leyenda_disertante_4 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Disertante 4')
    leyenda_disertante_5 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Disertante 5')
    leyenda_director_1 = models.CharField(max_length=200,blank= True,null=True, verbose_name='Director 1')
    CUR = 'CURSO'
    CUR_NUEVO = 'CURSO NUEVO'
    WEB = 'WEBINARIO'
    WEB_NUEVO = 'WEBINARIO NUEVO'
    CAF = 'CAFÉ FILOSÓFICO'
    CUL = 'NOCHES CULTURALES'
    JOR = 'JORNADA'
    REV = 'REVISTA'
    ADH = 'AD-HONOREM'
    CURED = 'CURSORED'
    LESIONES = 'LESIONES'
    URGENCIAS_NEUROLOGICAS = 'NEUROLOGÍA'
    SALUD_MENTAL = "SALUD_MENTAL"
    ENDOCRINOLOGIA = "ENDOCRINOLOGÍA"
    INVESTIGACION = "INVESTIGACIÓN"
    ECG = "ECG"
    URGENCIAS2025 = "URGENCIAS_2025"
    SALUD_MENTAL_25 = "SALUD MENTAL 2025"
    CIRUGIA_25 = "CIRUGIA 2025"
    CIRUGIA_26 = "CIRUGIA 2026"
    ASMA_26 = "DIA ASMA 2026"
    tipo_choices = (
        (CUR, 'Curso'),
        (CUR_NUEVO, 'Curso Nuevo'),
        (WEB, 'Webinario'),
        (WEB_NUEVO, 'Webinario Nuevo'),
        (CAF, 'Café Filosófico'),
        (CUL, 'Noches Culturales'),
        (JOR, 'Jornada'),
        (REV, 'Revista'),
        (ADH, 'Ad-honorem'),
        (CURED, 'Curso Redaccion'),
        (LESIONES, 'Curso de Lesiones Dérmicas'),
        (URGENCIAS_NEUROLOGICAS, 'Curso de Urgencias Neurológicas'),
        (SALUD_MENTAL, 'Curso de Urgencias en Salud Mental'),
        (ENDOCRINOLOGIA, 'Curso de Actualización en Endocrinología'),
        (INVESTIGACION, 'Curso de Investigacion'),
        (URGENCIAS2025, 'Curso de Urgencias 2025'),
        (ECG, 'Curso de Electrocardiofía'),
        (SALUD_MENTAL_25, 'Curso de Urgencias en Salud Mental 2025' ),
        (CIRUGIA_25, 'Jornada Interdisciplinaria de Cirugía General' ),
        (CIRUGIA_26, 'Jornada Interdisciplinaria de Cirugía General 2026' ),
        (ASMA_26, 'Día Mundial del Asma 2026' ),
    )

    #tipo = models.CharField(max_length=20, choices = tipo_choices, blank=True, null=True)
    tipo = models.CharField(max_length=80, blank=True, null=True)
    class Meta:
        indexes = [
            models.Index(fields=['anio']),
            models.Index(fields=['tipo']),
        ]
        
    def clean(self):
        if self.tipo and len(self.tipo) > 80:
            raise ValidationError({
                'tipo': 'El campo "tipo" no puede superar los 80 caracteres.'
            })

    # def __init__(self, arg):
    #     super(Curso, self).__init__()
    #     self.arg = arg
    def construir_leyenda_dni(self, dni, rol=None, sufijo=''):
        """Construye la línea del DNI usando una plantilla editable por curso."""
        plantilla = (self.plantilla_leyenda_dni or '').strip()
        datos = {
            'dni': str(dni),
            'leyenda_1': self.leyenda_1 or '',
            'rol': rol or '',
            'sufijo': sufijo or '',
        }

        if plantilla:
            try:
                return plantilla.format(**datos).strip()
            except (KeyError, ValueError):
                # Una plantilla mal escrita no debe impedir generar el diploma.
                pass

        partes = [f"D.N.I. {datos['dni']},"]
        if datos['leyenda_1']:
            partes.append(datos['leyenda_1'])
        if datos['rol']:
            partes.append(datos['rol'])
        texto = ' '.join(partes).strip()
        if datos['sufijo']:
            if datos['sufijo'][0] in ',.;:':
                texto += datos['sufijo']
            else:
                texto += ' ' + datos['sufijo']
        return texto.strip()

    def __int__(self):
        return self.id_curso
        
    def __str__(self):
         return f"{self.nombre or ''} ({self.anio or ''})"

    
class Alumno(models.Model):
    """docstring for Alumno"""
    id_alumno = models.OneToOneField(CustomUser,primary_key=True, on_delete=models.CASCADE)
    #apellido = models.CharField(max_length=45,blank= False,null=False)
    #nombre = models.CharField(max_length=45,blank= False,null=False)
    #tipo_doc = models.ForeignKey(Tipo_de_Documento, default = 1, on_delete=models.CASCADE, verbose_name='Tipo de Documento')
    nro_doc = models.CharField(max_length=10,blank= False,null=False, verbose_name='Nro. de Documento')
    cursos = models.ManyToManyField(Curso, through = 'Miembro')
    # def __init__(self, arg):
    #     super(Alumno, self).__init__()
    #     self.arg = arg
    def __str__(self):
        alumno = CustomUser.objects.get(id__exact = self.id_alumno)
        return (alumno.last_name + ', ' + alumno.first_name)

    # def __int__(self):
    #     return self.cursos
    def __int__(self):
        return self.id_alumno
    
class Miembro(models.Model):
    alumno = models.ForeignKey(Alumno, on_delete=models.CASCADE)
    curso = models.ForeignKey(Curso, on_delete=models.CASCADE)
    date_joined = models.DateField(blank=True, null=True,)

    #invite_reason = models.CharField(max_length=64, blank=True, null=True)

    enviar_mail = models.BooleanField(default=0, blank=True, null=True, verbose_name='¿Enviar Mail?')
    generado = models.BooleanField(default=0, blank=True, null=True, verbose_name='¿Generado?')

    ASI = 'ASISTENTE'
    DIS = 'DISERTANTE'
    DIR = 'DIRECTOR'
    DIRA = 'DIRECTORA'
    COR = 'COORDINADOR'
    CORA = 'COORDINADORA'
    COL = 'COLABORADOR'
    PROF ='PROFESOR DE TEATRO'
    AUT ='AUTOR'
    COL ='COLABORADOR'

    rol_choices = (
        (ASI, 'Asistente'),
        (DIS, 'Disertante'),
        (DIR, 'Director'),
        (DIRA, 'Directora'),
        (COR, 'Coordinador'),
        (CORA, 'Coodinadora'),
        (COL, 'Colaborador'),
        (PROF, 'Profesor de Teatro'),
        (AUT, 'Autor'),
        (COL, 'Colaborador'),
    )

    rol = models.CharField(max_length=20, choices = rol_choices, blank=True, null=True)
    def __int__(self):
        return self.alumno

class Responsable(models.Model):
    """docstring for Responsable"""


    apellido = models.CharField(max_length=45,blank= False,null=False)
    nombre = models.CharField(max_length=45,blank= False,null=False)
    #tipo_doc = models.ForeignKey(Tipo_de_Documento, default = 1, on_delete=models.CASCADE, verbose_name='Tipo de Documento')
    nro_doc = models.CharField(max_length=10,blank= False,null=False, verbose_name='Nro. de Documento')
    imagen_firma = models.ImageField(upload_to = 'static/firmas', blank = True, null = True, verbose_name='Firma')
    cargo = models.CharField(max_length=45,blank= False,null=True)
    cargo_2 = models.CharField(max_length=45,blank= True,null=True)
    cargo_3 = models.CharField(max_length=45,blank= True,null=True)
    cursos = models.ManyToManyField(Curso)
    # def __init__(self, arg):
    #     super(Responsable, self).__init__()
    #     self.arg = arg
    #     
    def __str__(self):
        apellido_y_nombre = self.apellido + ', ' + self.nombre
        return apellido_y_nombre

class DiplomaEmitido(models.Model):
    curso = models.ForeignKey(Curso, on_delete=models.CASCADE)
    dni = models.CharField(max_length=15)
    fecha = models.DateTimeField(auto_now_add=True)
    usuario = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL)
    hash = models.CharField(max_length=64)
