#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
模块名称：security_config.py
模块描述：安全测试配置数据库模型定义

作者：czj
创建日期：2026-07-21
最后修改：2026-07-21
"""

from datetime import datetime
from typing import Optional
from sqlalchemy import String, Text, JSON, DateTime, Boolean, Integer
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base


class SecurityConfig(Base):
    """
    安全测试配置数据库模型

    存储安全测试的目标服务器、测试账号、认证配置等信息。

    Attributes:
        id (str): 配置唯一标识
        name (str): 配置名称
        target_url (str): 目标服务器地址
        verify_ssl (bool): 是否验证SSL证书
        timeout (int): 请求超时时间（秒）
        accounts (dict): 测试账号配置（JSON）
        auth_config (dict): 认证配置（JSON）
        rate_limits (dict): 限流配置（JSON）
        is_default (bool): 是否为默认配置
        created_at (datetime): 创建时间
        updated_at (datetime): 更新时间
    """

    __tablename__ = "security_configs"

    id: Mapped[str] = mapped_column(String(64), primary_key=True, comment="配置ID")
    name: Mapped[str] = mapped_column(String(100), nullable=False, comment="配置名称")
    target_url: Mapped[str] = mapped_column(String(500), nullable=False, comment="目标服务器地址")
    server_ip: Mapped[Optional[str]] = mapped_column(String(50), default="", comment="服务器IP")
    verify_ssl: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否验证SSL证书")
    timeout: Mapped[int] = mapped_column(Integer, default=30, comment="请求超时时间(秒)")

    # 测试账号配置（JSON）
    # 格式: {"superadmin": {"username": "...", "password": "..."}, "admin": {...}, "user": {...}, "captcha": "csba"}
    accounts: Mapped[dict] = mapped_column(JSON, default=dict, comment="测试账号配置")

    # 认证配置（JSON）
    # 格式: {"token_type": "accessToken", "mechanism": "JWT", "login_path": "/platform/api/auth/login", ...}
    auth_config: Mapped[dict] = mapped_column(JSON, default=dict, comment="认证配置")

    # 限流配置（JSON）
    # 格式: {"brute_force_max": 20, "rate_limit_max": 100, "request_interval": 0.5}
    rate_limits: Mapped[dict] = mapped_column(JSON, default=dict, comment="限流配置")

    # API路径前缀（JSON）
    # 格式: {"meeting": "/api/", "monitor": "/monitor/api2/api/", ...}
    api_prefixes: Mapped[dict] = mapped_column(JSON, default=dict, comment="API路径前缀")

    is_default: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否为默认配置")
    description: Mapped[Optional[str]] = mapped_column(Text, default="", comment="配置描述")

    created_at: Mapped[datetime] = mapped_column(
        DateTime, default=datetime.utcnow, comment="创建时间"
    )
    updated_at: Mapped[datetime] = mapped_column(
        DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, comment="更新时间"
    )

    def __repr__(self) -> str:
        """字符串表示"""
        return f"<SecurityConfig(id={self.id}, name={self.name})>"

    def to_dict(self) -> dict:
        """
        转换为字典

        Returns:
            dict: 配置数据字典
        """
        return {
            "id": self.id,
            "name": self.name,
            "target_url": self.target_url,
            "server_ip": self.server_ip,
            "verify_ssl": self.verify_ssl,
            "timeout": self.timeout,
            "accounts": self.accounts or {},
            "auth_config": self.auth_config or {},
            "rate_limits": self.rate_limits or {},
            "api_prefixes": self.api_prefixes or {},
            "is_default": self.is_default,
            "description": self.description or "",
            "created_at": self.created_at.isoformat() if self.created_at else None,
            "updated_at": self.updated_at.isoformat() if self.updated_at else None,
        }

    def to_client_config(self) -> dict:
        """
        转换为 HttpClient 可用的配置格式（兼容参考实现 config.yaml 结构）

        Returns:
            dict: HttpClient 配置字典
        """
        return {
            "target": {
                "base_url": self.target_url,
                "server_ip": self.server_ip or self.target_url.replace("https://", "").replace("http://", "").split(":")[0],
                "verify_ssl": self.verify_ssl,
                "timeout": self.timeout,
            },
            "accounts": self.accounts or {},
            "auth": self.auth_config or {},
            "limits": self.rate_limits or {},
            "api_prefixes": self.api_prefixes or {},
        }
