# _*_ coding : UTF-8 _*_
# @Time : 2025/01/18 03:20
# @UpdateTime : 2025/01/18 03:20
# @Author : sonder
# @File : user.py
# @Software : PyCharm
# @Comment : 本程序
from tortoise import fields

from models.common import BaseModel


class User(BaseModel):
    """
    用户表模型。
    """

    username = fields.CharField(
        max_length=255,
        unique=True,
        description="用户名",
        source_field="username"  # 映射到数据库字段 username
    )
    """
    用户名。
    - 必须唯一。
    - 最大长度为 255 个字符。
    - 映射到数据库字段 username。
    """

    password = fields.CharField(
        max_length=255,
        description="密码",
        source_field="password"  # 映射到数据库字段 password
    )
    """
    密码。
    - 存储加密后的密码。
    - 最大长度为 255 个字符。
    - 映射到数据库字段 password。
    """

    email = fields.CharField(
        max_length=255,
        null=True,
        description="邮箱",
        source_field="email"  # 映射到数据库字段 email
    )
    """
    邮箱。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 email。
    """

    phone = fields.CharField(
        max_length=30,
        null=True,
        description="手机号",
        source_field="phone"  # 映射到数据库字段 phone
    )
    """
    手机号。
    - 最大长度为 30 个字符。
    - 允许为空。
    - 映射到数据库字段 phone。
    """

    nickname = fields.CharField(
        max_length=255,
        null=True,
        description="昵称",
        source_field="nickname"  # 映射到数据库字段 nickname
    )
    """
    昵称。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 nickname。
    """

    avatar = fields.CharField(
        max_length=255,
        null=True,
        description="头像",
        source_field="avatar"  # 映射到数据库字段 avatar
    )
    """
    头像。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 avatar。
    """

    gender = fields.SmallIntField(
        default=0,
        description="性别（1男，0女）",
        source_field="gender"  # 映射到数据库字段 gender
    )
    """
    性别。
    - 1：男
    - 0：女
    - 默认为 0。
    - 映射到数据库字段 gender。
    """

    status = fields.SmallIntField(
        default=1,
        description="用户状态（1启用，0禁用）",
        source_field="status"  # 映射到数据库字段 status
    )
    """
    用户状态。
    - 1：启用
    - 0：禁用
    - 默认为 1。
    - 映射到数据库字段 status。
    """

    department = fields.ForeignKeyField(
        "models.Department",
        related_name="users",
        null=True,
        description="所属部门",
        source_field="department_id"  # 映射到数据库字段 department_id
    )
    """
    所属部门。
    - 外键关联到 Department 表。
    - 如果为 null，则表示用户未分配部门。
    - 映射到数据库字段 department_id。
    """

    roles = fields.ManyToManyField(
        "models.Role",
        related_name="users",
        through="user_role",
        description="用户角色"
    )
    """
    用户角色。
    - 多对多关系，表示用户拥有的角色。
    - 通过中间表 `user_role` 关联角色表。
    """

    class Meta:
        table = "user"  # 数据库表名
        table_description = "用户表"  # 表描述
        ordering = ["-create_time"]  # 默认按创建时间倒序排序


class UserRole(BaseModel):
    """
    用户角色中间表。
    """

    user = fields.ForeignKeyField(
        "models.User",
        related_name="user_roles",
        source_field="user_id"  # 映射到数据库字段 user_id
    )
    role = fields.ForeignKeyField(
        "models.Role",
        related_name="user_roles",
        source_field="role_id"  # 映射到数据库字段 role_id
    )

    class Meta:
        table = "user_role"  # 数据库表名
        table_description = "用户角色中间表"  # 表描述
        unique_together = (("user_id", "role_id"),)  # 唯一约束，防止重复分配
