from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext_lazy as _

class CustomUser(AbstractUser):
    """
    Modèle utilisateur personnalisé centralisant la gestion des accès métiers.
    Hérite de AbstractUser pour conserver le hachage des mots de passe et la gestion de sessions.
    """
    class Role(models.TextChoices):
        ADMIN = 'ADMIN', _('Administrateur / Gérant')
        AGENT = 'AGENT', _('Agent de sécurité / Scan')

    role = models.CharField(
        max_length=10,
        choices=Role.choices,
        default=Role.AGENT, # Principe du moindre privilège : Agent par défaut
        help_text="Définit les permissions globales sur la plateforme."
    )

    def is_admin(self):
        """Retourne True si l'utilisateur est un gestionnaire ou un superutilisateur."""
        return self.role == self.Role.ADMIN or self.is_superuser

    def is_agent(self):
        """Retourne True si l'utilisateur est strictement un agent."""
        return self.role == self.Role.AGENT and not self.is_superuser

    def can_scan(self):
        """Autorise l'accès au scanner pour les agents ET les administrateurs."""
        return self.is_admin() or self.is_agent()

    def __str__(self):
        # Affiche le nom complet s'il est renseigné, sinon l'identifiant
        full_name = self.get_full_name()
        return f"{full_name} ({self.get_role_display()})" if full_name else f"{self.username} ({self.get_role_display()})"