from django.db import models
from django.utils import timezone

class Roles(models.Model):
    name = models.CharField(max_length=20, unique=True)

    def __str__(self):
        return f"{self.name}"


class AuthTypes(models.Model):
    name = models.CharField(max_length=5, unique=True)

    def __str__(self):
        return f"{self.name}"


class Users(models.Model):
    GENDER_CHOICES = [
        ('M', 'Male'),
        ('F', 'Female'),
        ('O', 'Other'),
    ]
    uid = models.CharField(max_length=255, unique=True, db_index=True)
    imgContentId=models.CharField(max_length=255, null=True, blank=True)
    email = models.EmailField(max_length=255, unique=True, db_index=True, blank=True, null=True)
    phone = models.CharField(max_length=255, unique=True, db_index=True, blank=True, null=True)
    isPhoneVerified = models.BooleanField(default=False)
    firstName = models.CharField(max_length=255, db_index=True, blank=True)
    middleName = models.CharField(max_length=255, db_index=True, blank=True)
    lastName = models.CharField(max_length=255, db_index=True, blank=True)
    sex = models.CharField(
        max_length=1,
        choices=GENDER_CHOICES,
        blank=True
    )
    birthday = models.DateField(null=True, blank=True)
    country = models.CharField(max_length=255, db_index=True, blank=True)
    city = models.CharField(max_length=255, db_index=True, blank=True)
    address = models.CharField(max_length=255, db_index=True, blank=True)
    language = models.CharField(max_length=255, db_index=True, blank=True)
    zipcode = models.IntegerField(null=True, blank=True)
    isActive = models.BooleanField(default=True)
    createdAt = models.DateTimeField(auto_now_add=True)
    updatedAt = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f"{self.firstName} {self.lastName} - {self.uid}"


class UserRoles(models.Model):
    user = models.ForeignKey(Users, on_delete=models.CASCADE)
    role = models.ForeignKey(Roles, on_delete=models.SET_NULL, null=True)
    profile = models.JSONField(null=True, blank=True)

    def __str__(self):
        return f"{self.user.firstName} {self.role.name}"

    class Meta:
        unique_together = ['user', 'role']

class UserAuthTypes(models.Model):
    user = models.ForeignKey(Users, on_delete=models.CASCADE)
    authType = models.ForeignKey(AuthTypes, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return f"{self.user.firstName} {self.authType.name}"

    class Meta:
        unique_together = ['user', 'authType']


class Otp(models.Model):
    STRATEGY_CHOICES = [
        ('email', 'email'),
        ('phone', 'phone'),
    ]
    PURPOSE_CHOICES = [
        ('login', 'login'),
        ('signup', 'signup'),
        ('verification', 'verification'),
    ]
    user = models.ForeignKey(Users, on_delete=models.CASCADE, null=True, blank=True)
    otp = models.IntegerField(null=False, blank=False)
    strategy = models.CharField(max_length=10, choices=STRATEGY_CHOICES, null=False, blank=False)
    purpose = models.CharField(max_length=12, choices=PURPOSE_CHOICES, null=False, blank=False)
    identifier = models.CharField(max_length=255, null=False, blank=False)
    duration = models.PositiveIntegerField(default=5)
    isUsed = models.BooleanField(default=False)
    createdAt = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.strategy} - {self.identifier} - {self.otp}"
    
    def is_expired(self):
        now = timezone.now()
        expiration_time = self.createdAt + timezone.timedelta(minutes=self.duration)
        return now > expiration_time