from django.db import models
import uuid
import re
from django.db.models.signals import pre_save
from django.dispatch import receiver

def default_data():
    return {'ops': [{'insert': '\n'}]}

def createAccessCode(name):
    cleanedName = re.sub(r'[^A-Za-z0-9]', '_', name)
    uniqueId = uuid.uuid4().hex
    return cleanedName[:217] + '-' + uniqueId[:10]

# Modèle qui gère l'enregistrement des cours en mémoire
class Course(models.Model):
    class AcademicLevel(models.TextChoices):  # On définit une nouvelle classe à l'intérieur de la classe précédente
        MiddleSchool = 'MS'
        HighSchool = 'HS'
        LicenseDegree = 'LD'
        PreparatoryClass = 'PC'
        MasterDegree = 'MD'
        DoctorateDegree = 'DD'
        ProfessionalTraining = 'PT'
        default = 'na'

    class SubjectStudied(models.TextChoices):  # Celle-ci sert pour la liste des matières enseignées
        Mathematics = 'MA'
        Physics = 'PH'
        Chemistry = 'CH'
        Biology = 'BI'
        English = 'EN'
        Spanish = 'SP'
        Frensh = 'FR'
        History = 'HI'
        Geography = 'GE'
        Philosophy = 'PI'
        ComputerSciences = 'CS'
        Finances = 'FI'
        Marketing = 'MR'
        default = 'na'

    name = models.CharField(max_length=255, default='')  # L'utilisateur doit obligatoirement donner un nom aux nouveaux cours qu'ils créé (dans certains cas un script javaScrpt pourra nommer le cours à partir de mots clés)
    academicLevel = models.CharField(max_length=255, blank=True, default='')
    subjectStudied = models.CharField(max_length=255, blank=True, default='')
    training = models.CharField(max_length=255, blank=True, default='')
    tags = models.JSONField(blank=True, default=dict)
    footnotes = models.JSONField(default=default_data)
    content = models.JSONField(blank=True, default=list)
    creationDate = models.DateTimeField(auto_now_add=True)
    modificationDate = models.DateTimeField(auto_now=True)
    publicIdentifier = models.UUIDField(unique=True, editable=False, default=uuid.uuid4)
    user = models.ForeignKey('user.User', to_field='publicIdentifier', on_delete=models.CASCADE, related_name='courses')
    shared = models.BooleanField(default=False)
    emailsAllowedToAccess = models.JSONField(blank=True, default=list)
    accessCode = models.CharField(max_length=255, blank=True, null=True, default=None)
    copied_from = models.ForeignKey('self', to_field='publicIdentifier', on_delete=models.SET_NULL, related_name='copies', null=True, blank=True)

    def save(self, *args, **kwargs):
        if not self.accessCode:
            self.accessCode = createAccessCode(self.name)
        super(Course, self).save(*args, **kwargs)