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



class TimeStampMixin(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True


class Quiz(TimeStampMixin):
    name = models.CharField(max_length=100)
    is_published = models.BooleanField(default=False)
    minutes_to_complete_quiz = models.PositiveIntegerField(default=1)
    icon = models.ImageField(upload_to='quiz_icons', null=True, blank=True, help_text='Icon must be a .png file,  60px * 60px')

    def __str__(self):
        return self.name


class Question(TimeStampMixin):
    QUESTION_TYPES = [
        (1, "Multiple Select"),
        (2, "Single Select"),
        (3, "Written Answer"),
    ]

    question_text = models.CharField(max_length=200)
    question_type = models.IntegerField(choices=QUESTION_TYPES)
    quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name="questions")

    def __str__(self):
        return self.question_text


class Option(TimeStampMixin):
    option_text = models.CharField(max_length=200)
    option_desc = models.CharField(null=True, blank=True, max_length=200)
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name="options")

    def __str__(self):
        return self.option_text


class Answer(TimeStampMixin):
    ANSWER_TYPES = [
        (1, "Written"),
        (2, "Single Select"),
        (3, "Multiple Select"),
    ]

    profile = models.ForeignKey('carers.Profile', on_delete=models.CASCADE)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    answer_type = models.IntegerField(choices=ANSWER_TYPES)
    answer_text = models.TextField(null=True, blank=True)  # For written answers
    selected_option = models.ForeignKey(
        Option,
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="single_select_answers",
    )  # For single-select answers
    selected_options = models.ManyToManyField(
        Option, blank=True, related_name="multi_select_answers"
    )  # For multi-select answers

    def clean(self):
        """Enforce validation for correct answer type usage."""
        if self.answer_type == 1 and not self.answer_text:
            raise ValidationError("Written answers must have answer_text.")
        if self.answer_type == 2 and not self.selected_option:
            raise ValidationError("Single select answers must have a selected_option.")
        if self.answer_type == 3 and not self.selected_options.exists():
            raise ValidationError("Multi-select answers must have selected_options.")

    def __str__(self):
        return f"Answer by {self.profile} for Question {self.question}"


class CompletedQuiz(TimeStampMixin):
    completed_at = models.DateTimeField(auto_now_add=True)
    profile = models.ForeignKey('carers.Profile', on_delete=models.CASCADE)
    quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)