from django.db import models
from users.models import Teacher


class Group(models.Model):
    STUDY_FORM = (
        ('full_time', 'Очная'),
        ('part_time', 'Заочная'),
        ('evening', 'Вечерняя'),
    )
    BUDGET_FORM = (
        ('budget', 'Бюджет'),
        ('contract', 'Платное'),
    )
    name = models.CharField(max_length=50, verbose_name='Название группы')
    academic_year = models.IntegerField(verbose_name='Учебный год')
    course_num = models.SmallIntegerField(verbose_name='Курс')
    study_form = models.CharField(max_length=20, choices=STUDY_FORM, default='full_time', verbose_name='Форма обучения')
    budget_form = models.CharField(max_length=20, choices=BUDGET_FORM, default='budget', verbose_name='Форма оплаты')
    speciality_code = models.CharField(max_length=20, blank=True, verbose_name='Код специальности')
    speciality_name = models.CharField(max_length=255, blank=True, verbose_name='Специальность')
    curator = models.ForeignKey(Teacher, on_delete=models.SET_NULL, null=True, blank=True,
                                related_name='curated_groups', verbose_name='Куратор')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')

    def __str__(self):
        return f"{self.name} ({self.academic_year})"

    class Meta:
        verbose_name = 'Группа'
        verbose_name_plural = 'Группы'


class Subject(models.Model):
    code = models.CharField(max_length=50, unique=True, verbose_name='Код предмета')
    name = models.CharField(max_length=255, verbose_name='Название')
    short_name = models.CharField(max_length=50, blank=True, verbose_name='Краткое название')

    def __str__(self):
        return f"{self.code} - {self.name}"

    class Meta:
        verbose_name = 'Предмет'
        verbose_name_plural = 'Предметы'


class Room(models.Model):
    """Аудитория/кабинет"""
    ROOM_TYPES = (
        ('classroom', 'Аудитория'),
        ('lab', 'Лаборатория'),
        ('computer', 'Компьютерный класс'),
        ('sport', 'Спортивный зал'),
        ('distance', 'Дистанционное обучение'),
    )
    number = models.CharField(max_length=20, verbose_name='Номер аудитории')
    name = models.CharField(max_length=100, blank=True, verbose_name='Название')
    room_type = models.CharField(max_length=20, choices=ROOM_TYPES, default='classroom', verbose_name='Тип')
    capacity = models.IntegerField(default=0, verbose_name='Вместимость')
    is_distance = models.BooleanField(default=False, verbose_name='Дистанционное обучение')

    def __str__(self):
        if self.is_distance:
            return "🌐 Дистант"
        return f"{self.number}"

    class Meta:
        verbose_name = 'Аудитория'
        verbose_name_plural = 'Аудитории'


class ScheduleItem(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='schedule_items', verbose_name='Группа')
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name='Предмет')
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, verbose_name='Преподаватель')
    room = models.ForeignKey(Room, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Аудитория')
    date = models.DateField(verbose_name='Дата занятия')
    weekday = models.IntegerField(verbose_name='День недели', null=True, blank=True)
    start_time = models.TimeField(verbose_name='Время начала')
    end_time = models.TimeField(verbose_name='Время окончания')
    topic = models.CharField(max_length=255, blank=True, verbose_name='Тема занятия')
    created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)

    def save(self, *args, **kwargs):
        # Автоматически заполняем weekday из date
        if self.date and not self.weekday:
            if isinstance(self.date, str):
                from datetime import datetime
                self.date = datetime.strptime(self.date, '%Y-%m-%d').date()
            self.weekday = self.date.isoweekday()
        super().save(*args, **kwargs)

    def __str__(self):
        return f"{self.group.name} - {self.subject.name} - {self.date} {self.start_time}"

    class Meta:
        verbose_name = 'Занятие'
        verbose_name_plural = 'Занятия'
        ordering = ['date', 'start_time']


class Attendance(models.Model):
    STATUS_CHOICES = (
        ('present', 'Присутствовал'),
        ('absent', 'Отсутствовал (неуважительная)'),
        ('late', 'Опоздал'),
        ('excused', 'Отсутствовал (уважительная)'),
    )
    student = models.ForeignKey('users.Student', on_delete=models.CASCADE, related_name='attendances',
                                verbose_name='Студент')
    schedule_item = models.ForeignKey(ScheduleItem, on_delete=models.CASCADE, related_name='attendances',
                                      verbose_name='Занятие')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='present', verbose_name='Статус')
    late_minutes = models.IntegerField(default=0, verbose_name='Минуты опоздания')

    class Meta:
        unique_together = ['student', 'schedule_item']
        verbose_name = 'Посещаемость'
        verbose_name_plural = 'Посещаемость'

    def __str__(self):
        return f"{self.student.last_name} - {self.schedule_item.subject.name}: {self.get_status_display()}"


class AcademicDebt(models.Model):
    DEBT_TYPES = (
        ('exam', 'Экзамен'),
        ('coursework', 'Курсовая работа'),
        ('lab', 'Лабораторная работа'),
        ('test', 'Зачёт'),
    )
    student = models.ForeignKey('users.Student', on_delete=models.CASCADE, related_name='debts', verbose_name='Студент')
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name='Предмет')
    debt_type = models.CharField(max_length=20, choices=DEBT_TYPES, verbose_name='Тип задолженности')
    assigned_date = models.DateField(auto_now_add=True, verbose_name='Дата возникновения')
    due_date = models.DateField(null=True, blank=True, verbose_name='Срок ликвидации')
    is_resolved = models.BooleanField(default=False, verbose_name='Ликвидирована')
    resolved_date = models.DateField(null=True, blank=True, verbose_name='Дата ликвидации')

    def __str__(self):
        return f"{self.student.last_name} - {self.subject.name}: {self.get_debt_type_display()}"

    class Meta:
        verbose_name = 'Академическая задолженность'
        verbose_name_plural = 'Академические задолженности'


class Olympiad(models.Model):
    LEVEL_CHOICES = (
        ('college', 'Колледж'),
        ('city', 'Городской'),
        ('regional', 'Региональный'),
        ('national', 'Всероссийский'),
        ('international', 'Международный'),
    )
    RESULT_CHOICES = (
        ('participant', 'Участник'),
        ('prize', 'Призёр'),
        ('winner', 'Победитель'),
    )
    student = models.ForeignKey('users.Student', on_delete=models.CASCADE, related_name='olympiads',
                                verbose_name='Студент')
    name = models.CharField(max_length=255, verbose_name='Название')
    level = models.CharField(max_length=20, choices=LEVEL_CHOICES, verbose_name='Уровень')
    result = models.CharField(max_length=20, choices=RESULT_CHOICES, verbose_name='Результат')
    year = models.IntegerField(verbose_name='Год')

    def __str__(self):
        return f"{self.student.last_name} - {self.name} ({self.year})"

    class Meta:
        verbose_name = 'Олимпиада'
        verbose_name_plural = 'Олимпиады'


# ==================== КАФЕДРА ====================

class Department(models.Model):
    name = models.CharField(max_length=255, verbose_name='Название кафедры')
    code = models.CharField(max_length=50, unique=True, verbose_name='Код кафедры')
    head = models.ForeignKey('users.Teacher', on_delete=models.SET_NULL, null=True, blank=True,
                             related_name='headed_departments', verbose_name='Заведующий')
    deputy = models.ForeignKey('users.Teacher', on_delete=models.SET_NULL, null=True, blank=True,
                               related_name='deputy_departments', verbose_name='Заместитель')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Кафедра'
        verbose_name_plural = 'Кафедры'


# ==================== УЧЕБНЫЕ МАТЕРИАЛЫ (CMS) ====================

class EducationalMaterial(models.Model):
    MATERIAL_TYPES = (
        ('news', 'Новость/Объявление'),
        ('lecture', 'Лекция'),
        ('methodical', 'Методическое пособие'),
        ('presentation', 'Презентация'),
        ('video', 'Видеоматериал'),
    )
    title = models.CharField(max_length=255, verbose_name='Заголовок')
    content = models.TextField(verbose_name='Содержание')
    material_type = models.CharField(max_length=20, choices=MATERIAL_TYPES, default='lecture', verbose_name='Тип материала')
    file = models.FileField(upload_to='materials/', blank=True, null=True, verbose_name='Файл')
    link = models.URLField(blank=True, null=True, verbose_name='Ссылка')
    author = models.ForeignKey('users.Teacher', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Автор')
    groups = models.ManyToManyField(Group, blank=True, related_name='materials', verbose_name='Доступно группам')
    is_published = models.BooleanField(default=True, verbose_name='Опубликовано')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='Дата обновления')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Учебный материал'
        verbose_name_plural = 'Учебные материалы'
        ordering = ['-created_at']