import uuid
from .security_models import AccountSecurity, AccountSession, AuthChallenge, PasskeyCredential, LoginIdentity, AccountDeletionRequest  # noqa: F401

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.db.models.functions import Lower
from .managers import UserManager


class User(AbstractUser):
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
    )

    email = models.EmailField(
        unique=True,
    )

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["username"]

    display_name = models.CharField(max_length=80, blank=True)
    language = models.CharField(max_length=5, choices=[("fa", "فارسی"), ("en", "English")], default="fa")
    timezone = models.CharField(max_length=64, default="Asia/Tehran")
    is_email_verified = models.BooleanField(default=False, editable=False)
    auth_version = models.UUIDField(default=uuid.uuid4, editable=False)
    updated_at = models.DateTimeField(auto_now=True)
    objects = UserManager()

    class Meta:
        constraints = [models.UniqueConstraint(Lower("email"), name="users_email_ci_unique")]

    def save(self, *args, **kwargs):
        self.email = type(self).objects.normalize_email(self.email)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.email


class AccountEmail(models.Model):
    """Durable outbox; dispatch_account_emails sends mail outside HTTP requests."""

    recipient = models.EmailField()
    subject = models.CharField(max_length=150)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    expires_at = models.DateTimeField()
    sent_at = models.DateTimeField(null=True, blank=True)
    attempts = models.PositiveSmallIntegerField(default=0)
    next_attempt_at = models.DateTimeField()

    class Meta:
        indexes = [models.Index(fields=["sent_at", "next_attempt_at"], name="users_email_pending_idx")]

