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

from models.common import BaseModel


class LoginLog(BaseModel):
    """
    系统访问记录表模型。
    """

    user = fields.ForeignKeyField(
        "models.User",
        related_name="login_logs",
        description="用户ID",
        source_field="user_id"  # 映射到数据库字段 user_id
    )
    """
    用户ID。
    - 外键关联到 User 表。
    - 映射到数据库字段 user_id。
    """

    login_ip = fields.CharField(
        max_length=50,
        description="登录IP地址",
        source_field="login_ip"  # 映射到数据库字段 login_ip
    )
    """
    登录IP地址。
    - 最大长度为 50 个字符。
    - 映射到数据库字段 login_ip。
    """

    login_location = fields.CharField(
        max_length=255,
        null=True,
        description="登录地点",
        source_field="login_location"  # 映射到数据库字段 login_location
    )
    """
    登录地点。
    - 根据 IP 地址解析的地理位置信息。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 login_location。
    """

    browser = fields.CharField(
        max_length=255,
        null=True,
        description="浏览器类型",
        source_field="browser"  # 映射到数据库字段 browser
    )
    """
    浏览器类型。
    - 记录用户登录时使用的浏览器类型。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 browser。
    """

    os = fields.CharField(
        max_length=255,
        null=True,
        description="操作系统",
        source_field="os"  # 映射到数据库字段 os
    )
    """
    操作系统。
    - 记录用户登录时使用的操作系统。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 os。
    """

    status = fields.SmallIntField(
        default=1,
        description="登录状态（1成功，0失败）",
        source_field="status"  # 映射到数据库字段 status
    )
    """
    登录状态。
    - 1：成功
    - 0：失败
    - 默认为 1。
    - 映射到数据库字段 status。
    """

    login_time = fields.DatetimeField(
        auto_now_add=True,
        description="登录时间",
        source_field="login_time"  # 映射到数据库字段 login_time
    )
    """
    登录时间。
    - 自动设置为当前时间。
    - 映射到数据库字段 login_time。
    """

    session_id = fields.CharField(
        max_length=36,
        null=True,
        description="会话ID",
        source_field="session_id"
    )
    """
    会话ID。
    - 记录用户登录时的会话ID。
    - 允许为空。
    - 映射到数据库字段 session_id。
    """

    class Meta:
        table = "login_log"  # 数据库表名
        table_description = "系统访问记录表"  # 表描述
        ordering = ["-login_time"]  # 默认按登录时间倒序排序


class OperationLog(BaseModel):
    """
    操作日志表模型。
    """

    operation_name = fields.CharField(
        max_length=255,
        description="操作名称",
        source_field="operation_name"  # 映射到数据库字段 operation_name
    )
    """
    操作名称。
    - 最大长度为 255 个字符。
    - 映射到数据库字段 operation_name。
    """

    operation_type = fields.SmallIntField(
        description="操作类型（增删改查）",
        source_field="operation_type"  # 映射到数据库字段 operation_type
    )
    """
    操作类型。
    - 增、删、改、查等操作类型。
    - 最大长度为 50 个字符。
    - 映射到数据库字段 operation_type。
    """

    request_path = fields.TextField(
        description="请求路径",
        source_field="request_path"  # 映射到数据库字段 request_path
    )
    """
    请求路径。
    - 记录用户请求的 API 路径。
    - 最大长度为 255 个字符。
    - 映射到数据库字段 request_path。
    """

    request_method = fields.CharField(
        max_length=10,
        description="请求方法",
        source_field="request_method"  # 映射到数据库字段 request_method
    )
    """
    请求方法。
    - 记录用户请求的 HTTP 方法（如 GET、POST、PUT、DELETE）。
    - 最大长度为 10 个字符。
    - 映射到数据库字段 request_method。
    """

    operator = fields.ForeignKeyField(
        "models.User",
        related_name="operation_logs",
        null=True,  # 允许操作人员为空
        description="操作人员",
        source_field="operator_id"  # 映射到数据库字段 operator_id
    )
    """
    操作人员。
    - 外键关联到 User 表。
    - 允许为空。
    - 映射到数据库字段 operator_id。
    """

    department = fields.ForeignKeyField(
        "models.Department",
        related_name="operation_logs",
        null=True,  # 允许操作人员为空
        description="操作人员所属部门",
        source_field="department_id"  # 映射到数据库字段 department_id
    )
    """
    操作人员所属部门。
    - 外键关联到 Department 表。
    - 允许为空。
    - 映射到数据库字段 department_id。
    """

    department_name = fields.CharField(
        max_length=255,
        description="部门名称",
        source_field="department_name"  # 映射到数据库字段 department_name
    )
    """
    部门名称。
    - 记录操作人员所属的部门名称。
    - 最大长度为 255 个字符。
    - 映射到数据库字段 department_name。
    """

    host = fields.CharField(
        max_length=50,
        description="主机地址",
        source_field="host"  # 映射到数据库字段 host
    )
    """
    主机地址。
    - 记录用户请求的 IP 地址。
    - 最大长度为 50 个字符。
    - 映射到数据库字段 host。
    """

    location = fields.CharField(
        max_length=255,
        null=True,
        description="操作地点",
        source_field="location"  # 映射到数据库字段 location
    )
    """
    操作地点。
    - 根据 IP 地址解析的地理位置信息。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 location。
    """

    user_agent = fields.TextField(
        null=True,
        description="用户请求头",
        source_field="user_agent"  # 映射到数据库字段 user_agent
    )
    """
    用户请求头。
    - 记录用户请求的 User-Agent 信息。
    - 允许为空。
    - 映射到数据库字段 user_agent。
    """

    browser = fields.CharField(
        max_length=255,
        null=True,
        description="浏览器类型",
        source_field="browser"  # 映射到数据库字段 browser
    )
    """
    浏览器类型。
    - 记录用户登录时使用的浏览器类型。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 browser。
    """

    os = fields.CharField(
        max_length=255,
        null=True,
        description="操作系统",
        source_field="os"  # 映射到数据库字段 os
    )
    """
    操作系统。
    - 记录用户登录时使用的操作系统。
    - 最大长度为 255 个字符。
    - 允许为空。
    - 映射到数据库字段 os。
    """

    request_params = fields.TextField(
        null=True,
        description="请求参数",
        source_field="request_params"  # 映射到数据库字段 request_params
    )
    """
    请求参数。
    - 记录用户请求的参数（任意格式，如字符串、JSON、XML 等）。
    - 允许为空。
    - 映射到数据库字段 request_params。
    """

    response_result = fields.TextField(
        null=True,
        description="返回结果",
        source_field="response_result"  # 映射到数据库字段 response_result
    )
    """
    返回结果。
    - 记录操作的返回结果（任意格式，如字符串、JSON、XML 等）。
    - 允许为空。
    - 映射到数据库字段 response_result。
    """

    status = fields.SmallIntField(
        default=1,
        description="操作状态（1成功，0失败）",
        source_field="status"  # 映射到数据库字段 status
    )
    """
    操作状态。
    - 1：成功
    - 0：失败
    - 默认为 1。
    - 映射到数据库字段 status。
    """

    operation_time = fields.DatetimeField(
        auto_now_add=True,
        description="操作时间",
        source_field="operation_time"  # 映射到数据库字段 operation_time
    )
    """
    操作时间。
    - 自动设置为当前时间。
    - 映射到数据库字段 operation_time。
    """

    cost_time = fields.FloatField(
        default=0,
        description="消耗时间（毫秒）",
        source_field="cost_time"  # 映射到数据库字段 cost_time
    )
    """
    消耗时间。
    - 记录操作消耗的时间（单位：毫秒）。
    - 默认为 0。
    - 映射到数据库字段 cost_time。
    """

    class Meta:
        table = "operation_log"  # 数据库表名
        table_description = "操作日志表"  # 表描述
        ordering = ["-operation_time"]  # 默认按操作时间倒序排序
