from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.conf import settings  # برای ارجاع به AUTH_USER_MODEL در مدل‌های دیگر
from django.utils import timezone
import random

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('ایمیل الزامی است')
        email = self.normalize_email(email)

        # وقتی username را حذف می‌کنیم، نباید انتظارش را داشته باشیم
        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)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser باید is_staff=True باشد')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser باید is_superuser=True باشد')

        return self.create_user(email, password, **extra_fields)


class User(AbstractUser):
    # حذف username کاملاً تا تضاد با AbstractUser نداشته باشیم
    username = None

    email = models.EmailField(unique=True,blank=True,null=True,verbose_name='ایمیل')
    phone_number = models.CharField(max_length=11, blank=True, null=True)
    avatar = models.ImageField(upload_to='images/profile', verbose_name='تصویر آواتار', null=True, blank=True)
    email_active_code = models.CharField(max_length=100, verbose_name='کد فعال سازی ایمیل', blank=True, null=True)
    about_user = models.TextField(null=True, blank=True, verbose_name='درباره شخص')
    address = models.TextField(null=True, blank=True, verbose_name='آدرس')

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []  # چون لاگین با ایمیل است

    # Manager سفارشی
    objects = UserManager()

    class Meta:
        verbose_name = 'کاربر'
        verbose_name_plural = 'کاربران'

    def __str__(self):
     return self.get_full_name() or self.email or f"User {self.pk}"

    # نکته: دیگر لازم نیست در save، username را برابر ایمیل کنیم چون username حذف شده است.


class UserProfile(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        verbose_name='کاربر'
    )
    phone = models.CharField(max_length=20, blank=True, null=True, verbose_name='شماره تماس')
    address = models.TextField(blank=True, null=True, verbose_name='آدرس')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ایجاد')

    def __str__(self):
        # چون username نداریم، بهتر است ایمیل یا نام کامل را برگردانیم
        display = self.user.get_full_name() or self.user.email
        return f"پروفایل {display}"

    class Meta:
        verbose_name = 'پروفایل کاربر'
        verbose_name_plural = 'پروفایل کاربران'




class UserOTP(models.Model):
    # این فیلد هم ایمیل را می‌گیرد هم شماره موبایل
    identifier = models.CharField(max_length=100)
    code = models.CharField(max_length=6)
    expiration_date = models.DateTimeField()

    def __str__(self):
        return f"{self.identifier} - {self.code}"

    @staticmethod
    def generate_code():
        return str(random.randint(10000, 99999))
