from django.db import models
from django.conf import settings
from django.core.validators import FileExtensionValidator

class Formation(models.Model):
    title = models.CharField(max_length=200, verbose_name="Titre de la formation")
    description = models.TextField(verbose_name="Description")
    image = models.ImageField(upload_to='formations/covers/', blank=True, null=True)
    image_url = models.URLField(blank=True, null=True, verbose_name="Lien image (si pas d'upload)")
    created_at = models.DateTimeField(auto_now_add=True)
    order = models.PositiveIntegerField(default=1, verbose_name="Ordre de la formation (1, 2, 3...)")
    
    class Meta:
        ordering = ['order', 'created_at']
    
    def __str__(self):
        return self.title

class Lesson(models.Model):
    formation = models.ForeignKey(Formation, on_delete=models.CASCADE, related_name='lessons')
    title = models.CharField(max_length=200)
    order = models.PositiveIntegerField(verbose_name="Ordre de la leçon (1, 2, 3...)")
    
    # Contenu - PDF obligatoire, vidéo optionnelle
    pdf_file = models.FileField(
        upload_to='lessons/pdfs/', 
        blank=True, null=True,  # Temporairement nullable pour migration, validation dans la vue admin
        validators=[FileExtensionValidator(allowed_extensions=['pdf'])]
    )
    video_url = models.URLField(blank=True, null=True, verbose_name="Lien Vidéo (YouTube/Vimeo) - Optionnel")
    video_file = models.FileField(
        upload_to='lessons/videos/',
        blank=True, null=True,
        verbose_name="Fichier vidéo (optionnel)"
    )
    
    # Contenu texte extrait pour l'IA (optionnel, on peut le faire à la volée)
    content_text = models.TextField(blank=True, help_text="Texte extrait du PDF pour l'IA")

    class Meta:
        ordering = ['order'] # Trie automatiquement par ordre croissant
        unique_together = ['formation', 'order'] # Impossible d'avoir deux leçons n°1

    def __str__(self):
        return f"{self.formation.title} - {self.order}. {self.title}"

class UserProgress(models.Model):
    """Suit la progression d'un élève sur une leçon spécifique."""
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE)
    is_completed = models.BooleanField(default=False)
    completed_at = models.DateTimeField(null=True, blank=True)
    score_quiz = models.IntegerField(default=0, help_text="Score obtenu au quiz de fin de leçon")

    class Meta:
        unique_together = ['user', 'lesson']

    def __str__(self):
        return f"{self.user.email} - {self.lesson.title} ({'Validé' if self.is_completed else 'En cours'})"


class UserFormationStatus(models.Model):
    """
    Suit l'état d'une formation complète pour un utilisateur
    (quiz final validé, score, date).
    Sert au déblocage de la formation N+1.
    """
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='formation_statuses')
    formation = models.ForeignKey(Formation, on_delete=models.CASCADE, related_name='user_statuses')
    is_completed = models.BooleanField(default=False)
    final_score = models.IntegerField(default=0, help_text="Score obtenu au quiz final (sur 15)")
    completed_at = models.DateTimeField(null=True, blank=True)
    last_attempt_at = models.DateTimeField(null=True, blank=True, help_text="Dernière tentative quiz final (pour cooldown 24h)")
    last_questions = models.JSONField(default=list, blank=True, help_text="Dernières questions du quiz final (pour revoir le quiz)")
    last_user_answers = models.JSONField(default=list, blank=True, help_text="Dernières réponses de l'utilisateur au quiz final")

    class Meta:
        unique_together = ['user', 'formation']

    def __str__(self):
        return f"{self.user.email} - {self.formation.title} ({'Validée' if self.is_completed else 'En cours'})"


class LessonQuizAttempt(models.Model):
    """Tentative de quiz de fin de leçon : pour afficher le résultat et appliquer le cooldown 24h si échec."""
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='lesson_quiz_attempts')
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='quiz_attempts')
    questions = models.JSONField(default=list, help_text="Liste des questions générées")
    user_answers = models.JSONField(default=list, help_text="Indices des réponses choisies")
    score = models.PositiveIntegerField(default=0)
    passed = models.BooleanField(default=False)
    attempted_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-attempted_at']

    def __str__(self):
        return f"{self.user.email} - {self.lesson.title} - {'OK' if self.passed else 'Échec'} ({self.attempted_at})"


class LessonChatMessage(models.Model):
    """
    Historique des échanges entre l'étudiant et Goonie pour une leçon donnée.
    Permet à l'IA de garder le contexte des questions/réponses.
    """
    ROLE_CHOICES = (
        ('USER', 'Utilisateur'),
        ('BOT', 'Goonie'),
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='lesson_messages')
    lesson = models.ForeignKey(Lesson, on_delete=models.CASCADE, related_name='chat_messages')
    role = models.CharField(max_length=10, choices=ROLE_CHOICES)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['created_at']

    def __str__(self):
        return f"{self.user.email} - {self.lesson.title} - {self.role}"