from django.db import models
from django.conf import settings
from django.utils import timezone


class Role(models.Model):
    """
    Роль пользователя.

    ВАЖНО: Модель находится в TENANT_APPS, поэтому автоматически изолируется
    по тенантам через django-tenants. Каждый тенант имеет свой набор ролей
    в своей PostgreSQL schema.

    Не нужно явно связывать с тенантом через FK - изоляция происходит автоматически!
    """
    PLATFORM_SUPPORT = 'platform_support'
    OWNER = 'owner'
    MANAGER = 'manager'
    FLORIST = 'florist'
    COURIER = 'courier'

    ROLE_CHOICES = [
        (PLATFORM_SUPPORT, 'Техподдержка платформы'),
        (OWNER, 'Владелец'),
        (MANAGER, 'Менеджер'),
        (FLORIST, 'Флорист'),
        (COURIER, 'Курьер'),
    ]

    # Роли, скрытые от пользователей тенанта (не отображаются в списках)
    HIDDEN_ROLES = [PLATFORM_SUPPORT]

    code = models.CharField(
        max_length=20,
        choices=ROLE_CHOICES,
        unique=True,
        verbose_name="Код роли"
    )
    name = models.CharField(
        max_length=100,
        verbose_name="Название"
    )
    description = models.TextField(
        blank=True,
        verbose_name="Описание"
    )
    is_system = models.BooleanField(
        default=True,
        verbose_name="Системная роль",
        help_text="Системные роли нельзя удалить"
    )
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Роль"
        verbose_name_plural = "Роли"
        ordering = ['code']

    def __str__(self):
        return self.name


class UserRole(models.Model):
    """
    Роль пользователя в текущем тенанте.

    ВАЖНО: Эта модель НЕ связывает пользователя с тенантом!
    Связь с тенантом обеспечивается автоматически через django-tenants
    (модель в TENANT_APPS = находится в schema тенанта).

    UserRole просто говорит: "этот пользователь имеет эту роль" (в рамках текущего тенанта).
    Один пользователь = одна роль в рамках одного тенанта.
    """
    user = models.OneToOneField(
        'accounts.CustomUser',
        on_delete=models.CASCADE,
        related_name='tenant_role',
        verbose_name="Пользователь",
        help_text="Пользователь тенанта (из tenant schema)"
    )
    role = models.ForeignKey(
        Role,
        on_delete=models.PROTECT,
        related_name='users',
        verbose_name="Роль"
    )
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(
        'accounts.CustomUser',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='created_user_roles',
        verbose_name="Создал"
    )
    is_active = models.BooleanField(
        default=True,
        verbose_name="Активен"
    )

    class Meta:
        verbose_name = "Роль пользователя"
        verbose_name_plural = "Роли пользователей"

    def __str__(self):
        return f"{self.user.email} - {self.role.name}"
