from django.db import models, connection, transaction
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.base_user import BaseUserManager
from django.utils import timezone

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, phone, password, **extra_fields):
        if not phone:
            raise ValueError('Users require a phone field')
        if not extra_fields.get('email'):
            raise ValueError('Users require an email field')
        user = self.model(phone=phone, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, phone, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(phone, password, **extra_fields)

    def create_superuser(self, phone, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')
        
        return self._create_user(phone, password, **extra_fields)

class User(AbstractUser):
    username = None
    phone = models.CharField(max_length=30, unique=True)  # Increased to accommodate temp user phones
    # points = models.FloatField(null=False, default=0)
    # ref = models.ForeignKey('self', null=True, blank=True, on_delete=models.DO_NOTHING)
    ref = models.IntegerField(_('Sponsor ID'), null=True, blank=True)
    email = models.CharField(max_length=50, unique=True)
    # ewallet = models.FloatField(null=False, default=0)
    
    GENDER_CHOICES = [
        ('M', '男'),
        ('F', '女'),
        ('N', '不指定'),
    ]
    gender = models.CharField(
        max_length=1,
        choices=GENDER_CHOICES,
        default='N',
        verbose_name='性别'
    )
    
    # Track user activity
    last_active_date = models.DateTimeField(
        null=True, 
        blank=True,
        verbose_name='Last Active',
        help_text='User last active date and time'
    )
    
    # Track temporary users
    is_temporary_user = models.BooleanField(
        default=False, 
        verbose_name='临时用户',
        help_text='标识这是一个临时创建的用户账户，等待正式注册'
    )
    # Group relations processing state (owner-scope)
    group_relations_state = models.CharField(max_length=16, default='idle')
    group_relations_started_at = models.DateTimeField(null=True, blank=True)
    group_relations_updated_at = models.DateTimeField(null=True, blank=True)
    group_relations_error_at = models.DateTimeField(null=True, blank=True)
    group_relations_last_retry_at = models.DateTimeField(null=True, blank=True)

    objects = UserManager()

    USERNAME_FIELD = 'phone'
    REQUIRED_FIELDS = ['email']
    
    class Meta:
        permissions = [
            ("can_receive_ai_report_emails", "Can receive AI analysis report emails"),
            ("can_manage_ai_reports", "Can manage and resolve AI analysis reports"),
        ]
    
    def update_last_active(self):
        """Update the last active date to now."""
        self.last_active_date = timezone.now()
        self.save(update_fields=['last_active_date'])
