import datetime
from django.conf import settings
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin

from .managers import UserManager

class Role(models.Model):
    name = models.CharField(max_length=20, unique=True)
    
    def save(self, *args, **kwargs):
        self.name = self.name.capitalize()
        super(Role, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

class User(AbstractBaseUser, PermissionsMixin):
    role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, blank=True)
    phone = models.CharField(max_length=11, unique=True)
    password = models.CharField(max_length=128)
    date_joined = models.DateTimeField(verbose_name='join date', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_verified = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'phone'
    REQUIRED_FIELDS = []

    def __str__(self) -> str:
        if self.is_superuser:
            return f'{self.phone} (Superuser)'
        else:
            return self.phone

class PendingUser(models.Model):
    phone =  models.CharField(max_length=20)
    verification_code = models.CharField(max_length=8, blank=True, null=True)
    password = models.CharField(max_length=255,blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return f"{str(self.phone)} {self.verification_code}"
    
    def is_valid(self) -> bool:
        lifespan_in_seconds = float(settings.OTP_EXPIRE_TIME * 60)
        now = datetime.datetime.now(datetime.timezone.utc)
        time_diff = now - self.created_at
        time_diff = time_diff.total_seconds()
        if time_diff >= lifespan_in_seconds:
            return False
        return True