# 联软LV7000配置管理
"""
从system_configs表读取联软API配置，构建LianruanClient实例。

联软配置键（前缀 integration_lianruan_）：
- integration_lianruan_base_url: 联软API地址（如 http://192.168.x.x:30098）
- integration_lianruan_api_account: API账号
- integration_lianruan_api_password: API密码
- integration_lianruan_validate_key: 验证密钥（可选）

配置方式：管理后台 → 系统集成 → 联软LV7000 → 填入账号密码
"""

import logging

from sqlalchemy.ext.asyncio import AsyncSession

from app.integrations.lianruan.client import LianruanClient
from app.integrations.lianruan.exceptions import LianruanConfigError
from app.models.system_config import SystemConfig

logger = logging.getLogger(__name__)

# 联软配置键前缀（与 admin_service INTEGRATION_DEFINITIONS 中的 key_prefix 一致）
_PREFIX = "integration_lianruan_"


async def _get_lianruan_config_value(db: AsyncSession, key_suffix: str) -> str:
    """读取单个联软配置值。

    Args:
        db: 数据库会话
        key_suffix: 配置键后缀（如 base_url / api_account）

    Returns:
        str: 配置值，不存在返回空字符串
    """
    full_key = f"{_PREFIX}{key_suffix}"
    from sqlalchemy import select
    result = await db.execute(select(SystemConfig).where(SystemConfig.key == full_key))
    config_row = result.scalar_one_or_none()
    return config_row.value if config_row else ""


async def get_lianruan_config(db: AsyncSession) -> dict:
    """从system_configs表读取联软配置。

    Args:
        db: 数据库会话

    Returns:
        dict: 包含 base_url / api_account / api_password / validate_key

    Raises:
        LianruanConfigError: 配置缺失
    """
    base_url = await _get_lianruan_config_value(db, "base_url")
    api_account = await _get_lianruan_config_value(db, "api_account")
    api_password = await _get_lianruan_config_value(db, "api_password")
    validate_key = await _get_lianruan_config_value(db, "validate_key")

    if not base_url:
        raise LianruanConfigError("联软API未配置：缺少Base URL")
    if not api_account:
        raise LianruanConfigError("联软API未配置：缺少API账号")
    if not api_password:
        raise LianruanConfigError("联软API未配置：缺少API密码")

    return {
        "base_url": base_url,
        "api_account": api_account,
        "api_password": api_password,
        "validate_key": validate_key,
    }


async def get_lianruan_client(db: AsyncSession) -> LianruanClient:
    """构建联软API客户端实例。

    从system_configs表读取配置，创建LianruanClient。

    Args:
        db: 数据库会话

    Returns:
        LianruanClient: 已配置的联软客户端

    Raises:
        LianruanConfigError: 配置缺失
    """
    cfg = await get_lianruan_config(db)

    return LianruanClient(
        base_url=cfg["base_url"],
        api_account=cfg["api_account"],
        api_password=cfg["api_password"],
        validate_key=cfg.get("validate_key", ""),
    )
