# =============================================================================
# 外部系统集成 — 凭据配置脚本
# =============================================================================
# 用法：
#   1. 在下方填入真实凭据（替换 <填入...> 占位符）
#   2. 保存文件
#   3. 运行：cd backend && python -m scripts.setup_integrations
#
# 说明：
#   - 脚本会将凭据写入 system_configs 数据库表
#   - 已存在的配置键会更新，不会重复插入
#   - 运行后可在管理后台 → 系统集成 页面查看和测试连接
#   - 此文件已在 .gitignore 中排除，凭据不会提交到 Git
# =============================================================================

# --------------------------------------------------------------------------
# 火绒企业版 — AccessKey 认证模式
# --------------------------------------------------------------------------
# 在火绒管理后台 → 系统设置 → API管理 中创建 AccessKey
HUORONG = {
    # 火绒管理后台的内网API地址（含协议和端口）
    "base_url": "<填入火绒Base URL，如 http://huorong.oa.servyou-it.com/:8080>",

    # AccessKey ID（在火绒后台创建API密钥时生成）
    "access_key_id": "59O8K6NSUW",

    # AccessKey Secret（创建时仅显示一次，请妥善保管）
    "access_key_secret": "VXM7B878BDUN0P5P5KYC",
}

# --------------------------------------------------------------------------
# 联软LV7000 — 账号密码认证模式
# --------------------------------------------------------------------------
# 在联软管理后台 → 系统设置 → API管理 中创建API账号
LIANRUAN = {
    # 联软管理后台的内网API地址（含协议和端口，默认端口30098）
    "base_url": "<填入联软Base URL，如 http://192.168.x.x:30098>",

    # API账号
    "api_account": "<填入API账号>",

    # API密码
    "api_password": "<填入API密码>",

    # 验证密钥（部分版本需要，无则留空字符串）
    "validate_key": "",
}


# ==========================================================================
# 以下为脚本逻辑，无需修改
# ==========================================================================

import asyncio
import sys
import os

# 将 backend 目录加入 Python 路径，以便导入 app 模块
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

from sqlalchemy import select
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker


async def upsert_config(
    session: AsyncSession,
    key: str,
    value: str,
    description: str,
) -> None:
    """插入或更新一条配置记录。

    如果 key 已存在则更新 value，否则插入新记录。

    Args:
        session: 数据库异步会话
        key: 配置键（如 integration_huorong_base_url）
        value: 配置值
        description: 配置说明
    """
    # 动态导入，避免在模块级别触发 app 初始化
    from app.models.system_config import SystemConfig

    # 查询是否已存在该配置键
    result = await session.execute(
        select(SystemConfig).where(SystemConfig.config_key == key)
    )
    existing = result.scalar_one_or_none()

    if existing:
        # 已存在 → 更新值
        existing.config_value = value
        print(f"  ✏️  更新: {key}")
    else:
        # 不存在 → 插入新记录
        new_config = SystemConfig(
            config_key=key,
            config_value=value,
            description=description,
        )
        session.add(new_config)
        print(f"  ➕ 新增: {key}")


async def setup_huorong(session: AsyncSession) -> None:
    """将火绒凭据写入数据库。

    Args:
        session: 数据库异步会话
    """
    # 检查是否还是占位符
    if HUORONG["base_url"].startswith("<"):
        print("⏭️  火绒：跳过（凭据未填写）")
        return

    print("\n🔥 配置火绒企业版...")
    prefix = "integration_huorong_"

    await upsert_config(session, f"{prefix}base_url", HUORONG["base_url"], "火绒 Base URL")
    await upsert_config(session, f"{prefix}access_key_id", HUORONG["access_key_id"], "火绒 AccessKey ID")
    await upsert_config(session, f"{prefix}access_key_secret", HUORONG["access_key_secret"], "火绒 AccessKey Secret")

    await session.commit()
    print("  ✅ 火绒配置已保存")


async def setup_lianruan(session: AsyncSession) -> None:
    """将联软凭据写入数据库。

    Args:
        session: 数据库异步会话
    """
    # 检查是否还是占位符
    if LIANRUAN["base_url"].startswith("<"):
        print("⏭️  联软：跳过（凭据未填写）")
        return

    print("\n💻 配置联软LV7000...")
    prefix = "integration_lianruan_"

    await upsert_config(session, f"{prefix}base_url", LIANRUAN["base_url"], "联软 Base URL")
    await upsert_config(session, f"{prefix}api_account", LIANRUAN["api_account"], "联软 API账号")
    await upsert_config(session, f"{prefix}api_password", LIANRUAN["api_password"], "联软 API密码")
    await upsert_config(session, f"{prefix}validate_key", LIANRUAN["validate_key"], "联软 验证密钥")

    await session.commit()
    print("  ✅ 联软配置已保存")


async def main() -> None:
    """脚本主入口：读取数据库连接 → 写入凭据配置。"""
    # 从 .env 或环境变量获取数据库连接地址
    # 优先使用同步驱动（psycopg2），因为此脚本不需要异步数据库操作
    database_url = os.environ.get("DATABASE_URL", "")

    # 如果是 postgresql:// 开头（同步驱动格式），转为 asyncpg 格式
    if database_url.startswith("postgresql://"):
        database_url = database_url.replace("postgresql://", "postgresql+asyncpg://", 1)

    # 回退到本地开发默认值
    if not database_url:
        database_url = "postgresql+asyncpg://postgres:postgres@localhost:5432/it_smart_desk"
        print(f"⚠️  未设置 DATABASE_URL，使用默认值: {database_url}")

    print(f"📦 数据库: {database_url.split('@')[-1]}")  # 只显示主机部分，隐藏密码

    # 创建异步引擎和会话工厂
    engine = create_async_engine(database_url, echo=False)
    async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

    async with async_session() as session:
        await setup_huorong(session)
        await setup_lianruan(session)

    # 关闭引擎连接池
    await engine.dispose()
    print("\n🎉 配置完成！请在管理后台 → 系统集成 中测试连接")


if __name__ == "__main__":
    asyncio.run(main())
