#lsx OAuth认证相关模型

from django.db import models
from django.contrib.auth import get_user_model
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

#lsx OAuth用户模型，用于存储第三方登录用户信息
class OAuthUser(models.Model):
    #lsx 用户名
    username = models.CharField(_('username'), max_length=100)
    #lsx 第三方平台类型
    oauth_type = models.CharField(
        _('oauth type'), max_length=20, blank=False, null=False)
    #lsx 第三方平台用户ID
    oauth_id = models.CharField(
        _('oauth id'), max_length=100, blank=False, null=False)
    #lsx 第三方平台访问令牌
    oauth_token = models.CharField(
        _('oauth token'), max_length=100, blank=True, null=True)
    #lsx 第三方平台刷新令牌
    oauth_token_secret = models.CharField(
        _('oauth token secret'), max_length=100, blank=True, null=True)
    #lsx 头像URL
    avatar = models.CharField(
        _('avatar'), max_length=200, blank=True, null=True)
    #lsx 绑定的本地用户
    user = models.ForeignKey(
        get_user_model(),
        verbose_name=_('user'),
        blank=True,
        null=True,
        on_delete=models.CASCADE)
    #lsx 创建时间
    created_time = models.DateTimeField(_('created time'), default=timezone.now)

    class Meta:
        #lsx 联合唯一约束，确保同一平台的用户ID唯一
        unique_together = ('oauth_type', 'oauth_id')
        #lsx 表名
        db_table = 'oauth_user'
        #lsx 管理后台显示名称
        verbose_name = _('OAuth user')
        verbose_name_plural = verbose_name

    #lsx 返回字符串表示
    def __str__(self):
        return f'{self.username} - {self.oauth_type}'

#lsx OAuth配置模型，用于存储各平台的OAuth配置
class OAuthConfig(models.Model):
    #lsx 平台名称
    platform = models.CharField(
        _('platform'), max_length=20, unique=True, blank=False, null=False)
    #lsx 应用ID
    app_id = models.CharField(
        _('app id'), max_length=100, blank=True, null=True)
    #lsx 应用密钥
    app_secret = models.CharField(
        _('app secret'), max_length=100, blank=True, null=True)
    #lsx 回调URL
    callback_url = models.CharField(
        _('callback url'), max_length=200, blank=True, null=True)
    #lsx 是否启用
    is_enable = models.BooleanField(
        _('is enable'), default=False, blank=False, null=False)
    #lsx 创建时间
    created_time = models.DateTimeField(_('created time'), default=timezone.now)
    #lsx 更新时间
    updated_time = models.DateTimeField(_('updated time'), default=timezone.now)

    class Meta:
        #lsx 表名
        db_table = 'oauth_config'
        #lsx 管理后台显示名称
        verbose_name = _('OAuth config')
        verbose_name_plural = verbose_name

    #lsx 返回字符串表示
    def __str__(self):
        return self.platform

    #lsx 保存时更新时间
    def save(self, *args, **kwargs):
        self.updated_time = timezone.now()
        super().save(*args, **kwargs)

#lsx OAuth登录记录模型，用于记录用户的OAuth登录历史
class OAuthLoginHistory(models.Model):
    #lsx 关联的OAuth用户
    oauth_user = models.ForeignKey(
        OAuthUser, verbose_name=_('oauth user'), on_delete=models.CASCADE)
    #lsx 登录IP
    login_ip = models.CharField(
        _('login ip'), max_length=50, blank=True, null=True)
    #lsx 登录设备信息
    device_info = models.CharField(
        _('device info'), max_length=200, blank=True, null=True)
    #lsx 登录时间
    login_time = models.DateTimeField(_('login time'), default=timezone.now)

    class Meta:
        #lsx 表名
        db_table = 'oauth_login_history'
        #lsx 管理后台显示名称
        verbose_name = _('OAuth login history')
        verbose_name_plural = verbose_name
        #lsx 按登录时间倒序排列
        ordering = ['-login_time']

    #lsx 返回字符串表示
    def __str__(self):
        return f'{self.oauth_user.username} - {self.login_time}'

#lsx OAuth绑定请求模型，用于处理临时的绑定请求
class OAuthBindRequest(models.Model):
    #lsx 临时令牌
    temp_token = models.CharField(
        _('temp token'), max_length=100, unique=True, blank=False, null=False)
    #lsx OAuth用户ID
    oauth_user_id = models.IntegerField(
        _('oauth user id'), blank=False, null=False)
    #lsx 请求时间
    request_time = models.DateTimeField(
        _('request time'), default=timezone.now, blank=False, null=False)
    #lsx 是否已使用
    is_used = models.BooleanField(
        _('is used'), default=False, blank=False, null=False)

    class Meta:
        #lsx 表名
        db_table = 'oauth_bind_request'
        #lsx 管理后台显示名称
        verbose_name = _('OAuth bind request')
        verbose_name_plural = verbose_name

    #lsx 返回字符串表示
    def __str__(self):
        return f'{self.temp_token} - {self.oauth_user_id}'

#lsx OAuth应用统计模型，用于统计各平台的OAuth使用情况
class OAuthAppStats(models.Model):
    #lsx 平台名称
    platform = models.CharField(
        _('platform'), max_length=20, unique=True, blank=False, null=False)
    #lsx 总登录次数
    login_count = models.IntegerField(
        _('login count'), default=0, blank=False, null=False)
    #lsx 今日登录次数
    today_login_count = models.IntegerField(
        _('today login count'), default=0, blank=False, null=False)
    #lsx 绑定用户数
    bind_user_count = models.IntegerField(
        _('bind user count'), default=0, blank=False, null=False)
    #lsx 最后更新时间
    last_update_time = models.DateTimeField(
        _('last update time'), default=timezone.now, blank=False, null=False)

    class Meta:
        #lsx 表名
        db_table = 'oauth_app_stats'
        #lsx 管理后台显示名称
        verbose_name = _('OAuth app stats')
        verbose_name_plural = verbose_name

    #lsx 返回字符串表示
    def __str__(self):
        return f'{self.platform} - {self.login_count}'

    #lsx 保存时更新时间
    def save(self, *args, **kwargs):
        self.last_update_time = timezone.now()
        super().save(*args, **kwargs)
