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

from models.common import BaseModel


class Department(BaseModel):
    """
    部门表模型。
    """

    name = fields.CharField(
        max_length=100,
        description="部门名称",
        source_field="name"  # 映射到数据库字段 name
    )
    """
    部门名称。
    - 最大长度为 100 个字符。
    - 映射到数据库字段 name。
    """

    parent_id = fields.CharField(
        max_length=36,
        default="",
        null=True,
        description="父部门ID",
        source_field="parent_id"  # 映射到数据库字段 parent_id
    )
    """
    父部门ID。
    - 用于表示部门的层级关系。
    - 默认为空字符串，表示顶级部门。
    - 映射到数据库字段 parent_id。
    """

    sort = fields.IntField(
        default=0,
        description="排序权重（0最高）",
        source_field="sort"  # 映射到数据库字段 sort
    )
    """
    排序权重。
    - 用于部门列表的排序，值越小越靠前。
    - 默认为 0。
    - 映射到数据库字段 sort。
    """

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

    principal = fields.CharField(
        max_length=64,
        description="部门负责人",
        source_field="principal"  # 映射到数据库字段 principal
    )
    """
    部门负责人。
    - 最大长度为 64 个字符。
    - 映射到数据库字段 principal。
    """

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

    status = fields.SmallIntField(
        default=1,
        description="状态（0正常 1停用）",
        source_field="status"  # 映射到数据库字段 status
    )
    """
    状态。
    - 1 表示正常，0 表示停用。
    - 默认为 1。
    - 映射到数据库字段 status。
    """

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

    class Meta:
        table = "department"  # 数据库表名
        table_description = "部门表"  # 表描述
        ordering = ["sort", "-create_time"]  # 默认按排序权重和创建时间排序


class DepartmentRole(BaseModel):
    """
    部门角色表模型。
    """

    department = fields.ForeignKeyField(
        "models.Department",
        related_name="department_roles",
        description="部门ID",
        source_field="department_id"  # 映射到数据库字段 department_id
    )
    """
    部门ID。
    - 外键关联到 Department 表。
    - 映射到数据库字段 department_id。
    """

    role = fields.ForeignKeyField(
        "models.Role",
        related_name="department_roles",
        description="角色ID",
        source_field="role_id"  # 映射到数据库字段 role_id
    )
    """
    角色ID。
    - 外键关联到 Role 表。
    - 映射到数据库字段 role_id。
    """

    class Meta:
        table = "department_role"  # 数据库表名
        table_description = "部门角色表"  # 表描述
        unique_together = (("department_id", "role_id"),)  # 唯一约束，防止重复分配
