"""
Custom User Model for Online Course Platform.
Extends AbstractBaseUser for full control over authentication.
"""
from django.contrib.auth.models import AbstractUser
from django.db import models
from utils.choices import ROLE_CHOICES, ROLE_STUDENT


class CustomUser(AbstractUser):
    """
    Custom user model with role-based access control.
    Roles: admin, support_staff, accounts_staff, teacher, student
    """
    full_name = models.CharField(max_length=150, blank=True)
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default=ROLE_STUDENT)
    phone_number = models.CharField(max_length=20, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    profile_picture = models.ImageField(
        upload_to='profile_pictures/', blank=True, null=True
    )
    email = models.EmailField(unique=True, blank=True)
    cnic = models.CharField(
        max_length=13,
        unique=True,
        blank=True,
        null=True,
        help_text='13-digit CNIC number (without dashes, e.g. 1234567890123)'
    )
    age = models.PositiveSmallIntegerField(blank=True, null=True)
    qualification = models.CharField(max_length=200, blank=True)
    last_degree = models.CharField(max_length=200, blank=True)
    work_experience = models.TextField(blank=True)
    reference_name = models.CharField(max_length=150, blank=True)
    reference_mobile = models.CharField(max_length=20, blank=True)
    prefer_certificate_privacy = models.BooleanField(
        default=False,
        help_text='If enabled, public certificate verification shows initials instead of full name.',
    )

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

    def __str__(self):
        return f"{self.username} ({self.get_role_display()})"

    @property
    def is_admin(self):
        return self.role == 'admin'

    @property
    def is_support_staff(self):
        return self.role == 'support_staff'

    @property
    def is_accounts_staff(self):
        return self.role == 'accounts_staff'

    @property
    def is_teacher(self):
        return self.role == 'teacher'

    @property
    def is_student(self):
        return self.role == 'student'

    @property
    def can_manage_admissions(self):
        return self.role in ('admin', 'accounts_staff')

    @property
    def can_view_fees(self):
        return self.role in ('admin', 'accounts_staff')

    @property
    def can_manage_payments(self):
        return self.role in ('admin', 'accounts_staff')

    @property
    def can_manage_tickets(self):
        return self.role in ('admin', 'support_staff')

    def get_display_name(self):
        return self.full_name if self.full_name else self.username
