from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils import timezone
import random
import string


class VerificationCode(models.Model):
    """邮箱验证码模型"""
    email = models.EmailField()
    code = models.CharField(max_length=6)
    created_at = models.DateTimeField(auto_now_add=True)
    is_verified = models.BooleanField(default=False)
    attempts = models.IntegerField(default=0)
    locked_until = models.DateTimeField(null=True, blank=True)

    class Meta:
        verbose_name = '验证码'
        verbose_name_plural = '验证码'
        unique_together = [['email', 'code']]

    def is_valid(self):
        """检查验证码是否有效"""
        if self.is_verified:
            return False
        if self.locked_until and timezone.now() < self.locked_until:
            return False
        # 检查10分钟内有效
        if (timezone.now() - self.created_at).total_seconds() > 600:
            return False
        return True

    def increment_attempts(self):
        """增加失败尝试次数，5次后锁定"""
        self.attempts += 1
        if self.attempts >= 5:
            self.locked_until = timezone.now() + timezone.timedelta(minutes=10)
        self.save()

    def mark_as_verified(self):
        """标记为已使用"""
        self.is_verified = True
        self.save()

    @staticmethod
    def generate_code():
        """生成6位数字验证码"""
        return ''.join(random.choices(string.digits, k=6))


class User(AbstractUser):
    ROLE_CHOICES = [
        ('superadmin', '超级管理员'),
        ('admin', '公司管理员'),
        ('seeker', '求职者'),
    ]
    email = models.EmailField(unique=True)  # 设置邮箱为唯一且必填
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='seeker')
    phone = models.CharField(max_length=20)
    organization = models.ForeignKey(
        'organizations.Organization',
        null=True, blank=True,
        on_delete=models.SET_NULL,
        related_name='admins'
    )

    @property
    def is_superadmin(self):
        return self.role == 'superadmin'

    @property
    def is_admin(self):
        return self.role == 'admin'

    @property
    def is_seeker(self):
        return self.role == 'seeker'

    class Meta:
        verbose_name = '用户'
        verbose_name_plural = '用户'
