"""
Модели пользователей и разрешений.
"""
from django.contrib.auth.models import User
from django.db import models


class UserPermission(models.Model):
    """
    Модель разрешения пользователя.
    
    Хранит гранулярные разрешения для конкретных действий в системе.
    """
    
    code = models.CharField(
        max_length=50,
        verbose_name="Код разрешения",
        db_index=True,
        help_text="Уникальный код разрешения",
    )
    
    def __str__(self):
        from ..permissions import PERMISSION_CHOICES
        choices_dict = dict(PERMISSION_CHOICES)
        return choices_dict.get(self.code, self.code)
    
    class Meta:
        verbose_name = "Разрешение"
        verbose_name_plural = "Разрешения"
        ordering = ["code"]


class CustomUser(models.Model):
    """
    Расширенная модель пользователя с ролями.

    Добавляет систему ролей к стандартной модели User Django.
    """

    ROLE_CHOICES = [
        ("admin", "Администратор"),
        ("moderator", "Модератор"),
        ("user", "Пользователь"),
    ]

    # Связи
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        verbose_name="Пользователь",
        help_text="Связанный пользователь Django",
    )

    # Основные поля
    role = models.CharField(
        max_length=20,
        choices=ROLE_CHOICES,
        default="user",
        verbose_name="Роль пользователя",
        db_index=True,
        help_text="Роль пользователя в системе",
    )
    
    # Индивидуальные разрешения (если пусто - используются права роли по умолчанию)
    user_permissions = models.ManyToManyField(
        UserPermission,
        related_name="users",
        verbose_name="Индивидуальные разрешения",
        blank=True,
        help_text="Если указаны - используются вместо прав роли по умолчанию",
    )
    
    # Флаг использования индивидуальных разрешений
    use_custom_permissions = models.BooleanField(
        default=False,
        verbose_name="Использовать индивидуальные разрешения",
        help_text="Если включено - используются индивидуальные разрешения вместо прав роли",
    )

    def __str__(self):
        return (
            f"{self.user.first_name} {self.user.last_name}"
            if self.user.first_name and self.user.last_name
            else self.user.username
        )
    
    def has_perm(self, permission_code):
        """
        Проверяет наличие разрешения у пользователя.
        
        Args:
            permission_code: Код разрешения
        
        Returns:
            bool: True если пользователь имеет разрешение
        """
        from ..permissions import has_permission
        return has_permission(self.user, permission_code)

    class Meta:
        verbose_name = "Пользователь"
        verbose_name_plural = "Пользователи"
        ordering = ["user__username"]
