from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils.translation import gettext_lazy as _


class UserManager(BaseUserManager):
    """Gestionnaire personnalisé : email à la place de username pour create_user / create_superuser."""

    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError("L'adresse email est obligatoire.")
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_active", True)
        extra_fields.setdefault("role", User.Role.ADMIN)
        extra_fields.setdefault("is_verified", True)
        if extra_fields.get("is_staff") is not True:
            raise ValueError("Le superuser doit avoir is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Le superuser doit avoir is_superuser=True.")
        return self.create_user(email, password, **extra_fields)


class User(AbstractUser):
    """
    Modèle utilisateur personnalisé pour Goon.
    On utilise l'email comme identifiant principal au lieu du username.
    """
    class Role(models.TextChoices):
        ADMIN = "ADMIN", "Administrateur"
        MENTOR = "MENTOR", "Mentor"
        USER = "USER", "Utilisateur"

    username = None  # On désactive le username par défaut
    email = models.EmailField(_("email address"), unique=True)
    
    # Champs spécifiques au projet Goon
    first_name = models.CharField(max_length=150, verbose_name="Prénom")
    last_name = models.CharField(max_length=150, verbose_name="Nom")
    phone = models.CharField(max_length=20, verbose_name="Téléphone", blank=True, null=True)
    location = models.CharField(max_length=255, verbose_name="Ville / Localisation", blank=True, null=True)

    # Étudiants (role=USER) : mentor assigné. Option C : auto à l'inscription + admin peut modifier.
    mentor = models.ForeignKey(
        "self",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="mentored_students",
        verbose_name="Mentor assigné",
    )

    role = models.CharField(
        max_length=50, 
        choices=Role.choices, 
        default=Role.USER, 
        verbose_name="Rôle"
    )

    # Champs pour la sécurité (OTP)
    otp_code = models.CharField(max_length=6, blank=True, null=True)
    otp_created_at = models.DateTimeField(blank=True, null=True)
    is_verified = models.BooleanField(default=False, verbose_name="Compte vérifié")

    # Notifications : recevoir les nouvelles offres d'emploi par email (lien désabonner dans l'email)
    receive_job_offers_notifications = models.BooleanField(
        default=True,
        verbose_name="Recevoir les offres d'emploi par email"
    )

    USERNAME_FIELD = 'email'  # L'email devient l'identifiant de connexion
    REQUIRED_FIELDS = ['first_name', 'last_name']

    objects = UserManager()

    def __str__(self):
        return self.email


class AppSetting(models.Model):
    """
    Réglages globaux modifiables depuis l'admin (ex. EMAIL_SSL_SKIP_VERIFY en prod).
    """
    key = models.CharField(max_length=255, unique=True, verbose_name="Clé")
    value = models.CharField(max_length=512, blank=True, verbose_name="Valeur")

    class Meta:
        verbose_name = "Réglage"
        verbose_name_plural = "Réglages"

    def __str__(self):
        return f"{self.key} = {self.value}"