from django.db import models
from django.core.validators import MinValueValidator
import uuid
from django.utils import timezone

class MasteryLevel(models.TextChoices): # Celle-ci sert pour définir le niveau de maitrise
    Low = 'L', 'Low'
    Medium = 'M', 'Medium'
    High = 'H', 'High'
    Perfect = 'P', 'Perfect'
    Uknown = 'U', 'Uknown'

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

def default_knowledge():
    return {
        'ops': [{'insert': '\n'}],
        'question': '',
        'comment': ''
    }


# Modèle qui gère l'enregistrement des flashcard en mémoire, dans la base de donnée
class Flashcard(models.Model):

    title = models.CharField(null=True, blank=True, max_length=255, default='') # Stock un éventuel titre de la flashcard
    question = models.JSONField(default=default_data)
    answer = models.JSONField(default=default_data)
    lastRevisionTime = models.DateTimeField(default=timezone.now) # la dernière date de à laquelle la carte a été révisée, la date par défaut est celle à laquelle la carte a été enregistrée (si elle n'a jamais été révisée)
    lastMasteryLevel = models.CharField(choices=MasteryLevel.choices, max_length=3, default='U')
    numberOfTimeViewed = models.IntegerField(validators=[MinValueValidator(0)],
                                             default=0) # Compteur du nombre de fois ou la carte a été révisée, prend la valeur 0 à l'initalisation (ce qui permet de repépérer notamment qu'une carte n'a jamais été révisée)
    hidden = models.BooleanField(default=False)
    inactive = models.BooleanField(default=False)
    weight = models.FloatField(blank=True, default=0)
    creationDate = models.DateTimeField(auto_now_add=True)
    modificationDate = models.DateTimeField(auto_now=True)
    publicIdentifier = models.UUIDField(unique=True, default=uuid.uuid4) # stock une chaine de caractère généré par uuid
    course = models.ForeignKey('course.Course', to_field='publicIdentifier', on_delete=models.CASCADE, related_name='flashcards')
    user = models.ForeignKey('user.User', to_field='publicIdentifier', on_delete=models.CASCADE, related_name='flashcards', blank=True, null=True)

    def save(self, *args, **kwargs):
        # Assurez-vous que l'utilisateur de la flashcard est l'utilisateur du cours
        if self.course and not self.user:
            self.user = self.course.user
        super(Flashcard, self).save(*args, **kwargs)
