from django.db import models
from django.core.validators import MinValueValidator
from academics.models import AcademicClass, Subject, SubjectTeacher
from people.models import Teacher


# =====================================================
# WEEK DAY TIME SLOT MASTER
# =====================================================


class WeekDay(models.Model):
    """
    Controls school working days & opening hours
    """

    WEEK_DAYS = [
        ("MON", "Monday"),
        ("TUE", "Tuesday"),
        ("WED", "Wednesday"),
        ("THU", "Thursday"),
        ("FRI", "Friday"),
        ("SAT", "Saturday"),
        ("SUN", "Sunday"),
    ]

    day_code = models.CharField(
        max_length=3, choices=WEEK_DAYS, unique=True, null=True, blank=True
    )

    day_name = models.CharField(max_length=20, null=True, blank=True)

    is_open = models.BooleanField(default=True)

    start_time = models.TimeField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

    default_period_duration = models.PositiveIntegerField(
        null=True,
        blank=True,
        help_text="Duration in minutes",
        validators=[MinValueValidator(1)],
    )

    break_after_periods = models.PositiveIntegerField(
        null=True, blank=True, help_text="Break after every N periods"
    )

    break_duration = models.PositiveIntegerField(
        null=True, blank=True, help_text="Break duration in minutes"
    )

    auto_generate_periods = models.BooleanField(default=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.day_name}"


class TimeTable(models.Model):

    academic_class = models.ForeignKey(
        AcademicClass,  # DIRECT IMPORT - NOT STRING
        on_delete=models.CASCADE,
        related_name="timetables",
        null=True,
        blank=True,
    )

    weekday = models.ForeignKey(
        WeekDay,
        on_delete=models.SET_NULL,
        related_name="timetable_entries",
        null=True,
        blank=True,
    )

    subject = models.ForeignKey(
        Subject,  # DIRECT IMPORT - NOT STRING
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
    )

    subject_teacher = models.ForeignKey(
        SubjectTeacher,  # DIRECT IMPORT - NOT STRING
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
    )

    period_number = models.PositiveIntegerField(null=True, blank=True)

    start_time = models.TimeField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

    room_number = models.CharField(max_length=20, null=True, blank=True)

    is_break = models.BooleanField(default=False)

    is_substitution = models.BooleanField(default=False)

    substitute_teacher = models.ForeignKey(
        Teacher,  # DIRECT IMPORT - NOT STRING
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="substitute_periods",
    )

    notes = models.TextField(null=True, blank=True)

    is_active = models.BooleanField(default=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        # REMOVED the unique_together constraint
        # unique_together = (("academic_class", "weekday", "period_number"),)
        # You can add indexes for performance if needed
        indexes = [
            models.Index(fields=["academic_class", "weekday", "period_number"]),
            models.Index(fields=["academic_class", "weekday"]),
            models.Index(fields=["subject_teacher"]),
            models.Index(fields=["substitute_teacher"]),
        ]

    def __str__(self):
        return f"{self.academic_class} - {self.weekday} - P{self.period_number}"
