from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('Email обязателен')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('role', 'admin')
        return self.create_user(email, password, **extra_fields)

class User(AbstractBaseUser, PermissionsMixin):
    ROLE_CHOICES = (
        ('student', 'Студент'),
        ('parent', 'Родитель'),
        ('teacher', 'Преподаватель'),
        ('academic_staff', 'Учебная часть'),
        ('admin', 'Администратор'),
    )
    email = models.EmailField(unique=True, verbose_name='Email')
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='student', verbose_name='Роль')
    is_active = models.BooleanField(default=True, verbose_name='Активен')
    is_staff = models.BooleanField(default=False, verbose_name='Персонал')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Дата регистрации')

    objects = UserManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = 'Пользователь'
        verbose_name_plural = 'Пользователи'

    def __str__(self):
        return self.email

    def get_full_name(self):
        if hasattr(self, 'student') and self.student:
            return f"{self.student.last_name} {self.student.first_name}"
        elif hasattr(self, 'teacher') and self.teacher:
            return f"{self.teacher.last_name} {self.teacher.first_name}"
        return self.email


class Student(models.Model):
    SCHOLARSHIP_CHOICES = (
        ('academic', 'Академическая'),
        ('social', 'Социальная'),
        ('none', 'Не получает'),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='student', verbose_name='Пользователь')
    last_name = models.CharField(max_length=100, verbose_name='Фамилия')
    first_name = models.CharField(max_length=100, verbose_name='Имя')
    middle_name = models.CharField(max_length=100, blank=True, verbose_name='Отчество')
    birth_date = models.DateField(verbose_name='Дата рождения')
    group = models.ForeignKey('core.Group', on_delete=models.SET_NULL, null=True, blank=True, related_name='students', verbose_name='Группа')
    enrollment_year = models.IntegerField(verbose_name='Год поступления')
    student_id_number = models.CharField(max_length=50, unique=True, null=True, blank=True, verbose_name='Номер студенческого')
    has_job = models.BooleanField(default=False, verbose_name='Работает')
    job_place = models.CharField(max_length=255, blank=True, verbose_name='Место работы')
    receives_scholarship = models.BooleanField(default=True, verbose_name='Получает стипендию')
    scholarship_type = models.CharField(max_length=20, choices=SCHOLARSHIP_CHOICES, default='academic', verbose_name='Тип стипендии')
    phone = models.CharField(max_length=20, blank=True, verbose_name='Телефон')
    address = models.TextField(blank=True, verbose_name='Адрес')

    def __str__(self):
        return f"{self.last_name} {self.first_name}"

    class Meta:
        verbose_name = 'Студент'
        verbose_name_plural = 'Студенты'


class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='teacher', verbose_name='Пользователь')
    last_name = models.CharField(max_length=100, verbose_name='Фамилия')
    first_name = models.CharField(max_length=100, verbose_name='Имя')
    middle_name = models.CharField(max_length=100, blank=True, verbose_name='Отчество')
    birth_date = models.DateField(verbose_name='Дата рождения')
    position = models.CharField(max_length=100, verbose_name='Должность')
    department = models.CharField(max_length=255, blank=True, verbose_name='Кафедра')
    subjects = models.ManyToManyField('core.Subject', related_name='teachers', blank=True, verbose_name='Преподаваемые предметы')
    phone = models.CharField(max_length=20, blank=True, verbose_name='Телефон')
    hire_date = models.DateField(verbose_name='Дата приёма на работу')

    def __str__(self):
        return f"{self.last_name} {self.first_name} ({self.position})"

    class Meta:
        verbose_name = 'Преподаватель'
        verbose_name_plural = 'Преподаватели'


class Parent(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='parent', verbose_name='Пользователь')
    last_name = models.CharField(max_length=100, verbose_name='Фамилия')
    first_name = models.CharField(max_length=100, verbose_name='Имя')
    middle_name = models.CharField(max_length=100, blank=True, verbose_name='Отчество')
    birth_date = models.DateField(verbose_name='Дата рождения')
    phone = models.CharField(max_length=20, verbose_name='Телефон')
    address = models.TextField(blank=True, verbose_name='Адрес')
    children = models.ManyToManyField(Student, related_name='parents', verbose_name='Дети')

    def __str__(self):
        return f"{self.last_name} {self.first_name}"

    class Meta:
        verbose_name = 'Родитель'
        verbose_name_plural = 'Родители'