from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.utils import timezone

class UsuarioUtrauManager(BaseUserManager):
    def create_user(self, username, email=None, password=None, **extra_fields):
        if not username:
            raise ValueError('El Alias/Usuario es obligatorio para UTRAU')
        email = self.normalize_email(email) if email else None
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email=None, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(username, email, password, **extra_fields)

class UsuarioUtrau(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=150, unique=True, verbose_name="Usuario / Alias")
    # ATENCIÓN: Eliminé unique=True del email para evitar los conflictos de Allauth con campos vacíos
    email = models.EmailField(max_length=254, null=True, blank=True, verbose_name="Correo electrónico")
    nombre_completo = models.CharField(max_length=255, verbose_name="Nombre completo")
    cedula = models.CharField(max_length=20, null=True, blank=True, unique=True, verbose_name="Cédula de Identidad")
    celular = models.CharField(max_length=20, null=True, blank=True, verbose_name="Celular / WhatsApp")
    departamento = models.CharField(max_length=100, null=True, blank=True, verbose_name="Departamento")
    
    foto_perfil = models.ImageField(upload_to='perfiles/', null=True, blank=True, verbose_name="Foto de Perfil")
    
    id_facebook = models.CharField(max_length=255, null=True, blank=True, unique=True, verbose_name="ID Facebook")
    id_google = models.CharField(max_length=255, null=True, blank=True, unique=True, verbose_name="ID Google")
    
    # Asignamos el asistente 1 por defecto para que las redes sociales no den error
    asistente_preferido = models.IntegerField(default=1, verbose_name="Asistente Preferido")
    
    requiere_cambio_pin = models.BooleanField(default=False, verbose_name="Requiere Cambio de PIN")
    
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now)

    groups = models.ManyToManyField(
        'auth.Group',
        verbose_name='groups',
        blank=True,
        related_name='usuario_utrau_groups',
        related_query_name='usuario_utrau',
    )
    user_permissions = models.ManyToManyField(
        'auth.Permission',
        verbose_name='user permissions',
        blank=True,
        related_name='usuario_utrau_permissions',
        related_query_name='usuario_utrau',
    )

    objects = UsuarioUtrauManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['nombre_completo']

    class Meta:
        db_table = '_usuarios_utrau'
        verbose_name = "Usuario de UTRAU"
        verbose_name_plural = "Usuarios de UTRAU"

    def __str__(self):
        return self.nombre_completo if self.nombre_completo else self.username

class ColaMensajes(models.Model):
    contacto = models.CharField(max_length=255, verbose_name="Destino (WhatsApp/Email)")
    mensaje = models.TextField(verbose_name="Mensaje a enviar")
    estado = models.CharField(max_length=50, default='Pendiente', verbose_name="Estado de Envío")
    fecha_creacion = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = '_cola_mensajes'
        verbose_name = "Mensaje en Cola"
        verbose_name_plural = "Mensajes en Cola"

    def __str__(self):
        return f"[{self.estado}] -> {self.contacto}"