from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models


class Role(models.TextChoices):
    ADMIN = "admin", "Administrateur"
    EDITEUR = "editeur", "Éditeur"
    REDACTEUR = "redacteur", "Rédacteur"
    LECTEUR = "lecteur", "Lecteur"


BACKOFFICE_ROLES = {Role.ADMIN, Role.EDITEUR, Role.REDACTEUR}


class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra):
        if not email:
            raise ValueError("L'adresse email est obligatoire.")
        user = self.model(email=self.normalize_email(email), **extra)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra):
        extra.setdefault("is_superuser", False)
        return self._create_user(email, password, **extra)

    def create_superuser(self, email, password=None, **extra):
        extra.update(is_superuser=True, is_staff=True, role=Role.ADMIN)
        extra.setdefault("name", email.split("@")[0])
        return self._create_user(email, password, **extra)


class User(AbstractUser):
    username = None
    first_name = None
    last_name = None

    name = models.CharField("nom complet", max_length=255)
    email = models.EmailField("adresse email", unique=True)
    role = models.CharField("rôle", max_length=20, choices=Role.choices, default=Role.LECTEUR, db_index=True)
    fonction = models.CharField("fonction", max_length=120, blank=True, help_text="Ex. : Journaliste, Reporter…")
    bio = models.TextField("biographie", blank=True)
    email_verified_at = models.DateTimeField(null=True, blank=True, editable=False)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["name"]

    objects = UserManager()

    class Meta:
        ordering = ["name"]
        verbose_name = "utilisateur"

    def __str__(self):
        return self.name or self.email

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return (self.name or self.email).split(" ")[0]

    def save(self, *args, **kwargs):
        # Seuls les administrateurs accèdent à l'admin technique Django (/systeme/).
        self.is_staff = self.role == Role.ADMIN or self.is_superuser
        super().save(*args, **kwargs)

    @property
    def initials(self):
        parts = (self.name or self.email).split()
        return "".join(p[0] for p in parts[:2]).upper()

    @property
    def is_admin(self):
        return self.is_active and (self.role == Role.ADMIN or self.is_superuser)

    @property
    def is_editeur(self):
        """Éditeur ou plus : gère tout le contenu."""
        return self.is_active and (self.role in {Role.ADMIN, Role.EDITEUR} or self.is_superuser)

    @property
    def is_redacteur(self):
        return self.is_active and self.role == Role.REDACTEUR

    @property
    def has_backoffice_access(self):
        return self.is_active and (self.role in BACKOFFICE_ROLES or self.is_superuser)
