# =============================================================================
# 企微IT智能服务台 — 火绒集成配置管理
# =============================================================================
# 说明：从系统配置表(system_configs)读取火绒 AccessKey/Secret/BaseUrl，
#       构建火绒API客户端实例
# =============================================================================

import logging
from typing import Optional

from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.models.system_config import SystemConfig
from .client import HuorongClient
from .exceptions import HuorongConfigError

logger = logging.getLogger(__name__)

# 火绒配置在 system_configs 表中的 key 前缀
HUORONG_CONFIG_PREFIX = "integration_huorong_"


async def get_huorong_client(db: AsyncSession) -> HuorongClient:
    """从系统配置表构建火绒API客户端。

    读取 integration_huorong_ 前缀的配置项，构建 HuorongClient 实例。
    如果任何必填配置缺失，抛出 HuorongConfigError。

    Args:
        db: 数据库会话

    Returns:
        HuorongClient: 已配置的火绒API客户端实例

    Raises:
        HuorongConfigError: AccessKey ID/Secret/Base URL 任一缺失
    """
    # 读取三个必填配置
    result = await db.execute(
        select(SystemConfig).where(
            SystemConfig.config_key.startswith(HUORONG_CONFIG_PREFIX)
        )
    )
    configs = list(result.scalars().all())

    # 构建 key→value 映射
    config_map = {cfg.config_key: cfg.config_value for cfg in configs}

    access_key_id = config_map.get(f"{HUORONG_CONFIG_PREFIX}access_key_id", "")
    access_key_secret = config_map.get(f"{HUORONG_CONFIG_PREFIX}access_key_secret", "")
    base_url = config_map.get(f"{HUORONG_CONFIG_PREFIX}base_url", "")

    # 校验必填项
    if not access_key_id or not access_key_secret or not base_url:
        missing = []
        if not access_key_id:
            missing.append("AccessKey ID")
        if not access_key_secret:
            missing.append("AccessKey Secret")
        if not base_url:
            missing.append("Base URL")
        raise HuorongConfigError(
            f"火绒集成配置不完整，缺失: {', '.join(missing)}，请先在管理后台完成配置"
        )

    return HuorongClient(
        access_key_id=access_key_id,
        access_key_secret=access_key_secret,
        base_url=base_url,
    )


async def is_huorong_configured(db: AsyncSession) -> bool:
    """检查火绒集成是否已完整配置。

    Args:
        db: 数据库会话

    Returns:
        bool: 三项配置均存在且非空时返回 True
    """
    try:
        client = await get_huorong_client(db)
        return bool(client.access_key_id and client.access_key_secret and client.base_url)
    except HuorongConfigError:
        return False
