"""
Modelo CustomUser — App Users
================================
Usuario personalizado con email como login y 3 roles diferenciados.
Extiende AbstractBaseUser + PermissionsMixin (no AbstractUser).
"""

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.db import models
from django.utils.translation import gettext_lazy as _

from .managers import CustomUserManager


class CustomUser(AbstractBaseUser, PermissionsMixin):
    """
    Modelo de usuario personalizado para la clínica.
    Login por EMAIL — sin campo username.
    """

    class Rol(models.TextChoices):
        ADMIN = "admin", _("Administrador")
        DOCTORA = "doctora", _("Doutora")
        PACIENTE = "paciente", _("Paciente")

    # --- Campos de identidad ---
    email = models.EmailField(
        _("email"),
        unique=True,
        db_index=True,
        error_messages={"unique": _("Já existe um utilizador com este email.")},  
    )
    nombre = models.CharField(_("nome"), max_length=100)
    apellido = models.CharField(_("apelido"), max_length=100)
    telefono = models.CharField(_("telefone"), max_length=20, blank=True)
    foto_perfil = models.ImageField(
        _("foto de perfil"),
        upload_to="perfiles/%Y/%m/",
        blank=True,
    )

    # --- Rol ---
    rol = models.CharField(
        _("função"),
        max_length=20,
        choices=Rol.choices,
        default=Rol.PACIENTE,
        db_index=True,
    )

    # --- Estado ---
    is_active = models.BooleanField(_("ativo"), default=True)
    is_staff = models.BooleanField(_("staff"), default=False)
    is_verified = models.BooleanField(_("email verificado"), default=False)
    fecha_registro = models.DateTimeField(_("data de registo"), auto_now_add=True)

    # --- Manager y config ---
    objects = CustomUserManager()
    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["nombre", "apellido"]

    class Meta:
        verbose_name = _("utilizador")
        verbose_name_plural = _("utilizadores")
        ordering = ["-fecha_registro"]

    def __str__(self):
        return f"{self.get_full_name()} ({self.get_rol_display()})"

    def get_full_name(self):
        return f"{self.nombre} {self.apellido}".strip()

    def get_short_name(self):
        return self.nombre

    # --- Helpers de rol ---
    @property
    def es_admin(self):
        return self.rol == self.Rol.ADMIN

    @property
    def es_doctora(self):
        return self.rol == self.Rol.DOCTORA

    @property
    def es_paciente(self):
        return self.rol == self.Rol.PACIENTE

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Envía un email al usuario."""
        from django.core.mail import send_mail

        send_mail(subject, message, from_email, [self.email], **kwargs)
