"""Standalone Agent 配置 — 场景路由、Agent定义、模型配置"""

from app.core.config import settings

# ==================== LLM 配置（从 Settings 读取）====================
# 使用硅基流动云端 API
LLM_API_BASE = getattr(settings, "LLM_API_BASE", None) or settings.SILICONFLOW_API_BASE
LLM_API_KEY = getattr(settings, "LLM_API_KEY", None) or ""
LLM_MODEL = getattr(settings, "LLM_MODEL", None) or settings.AI_SCENE_CHAT_MODEL


# 场景→温度映射
SCENE_TEMPERATURE_MAP = {
    "general_chat": 0.7,
    "case_chat": 0.5,
    "cause_analysis": 0.3,
    "discretion_analysis": 0.3,
    "violation_analysis": 0.3,
    "interrogation_strategy": 0.4,
    "document_generation": 0.2,
    "knowledge_search": 0.3,
    "knowledge_chat": 0.3,
    "title_generation": 0.3,
}

# 场景→AI场景key映射（用于从 system_configs 读取配置）
# 注意：文书生成(document_generation)不需要AI，不在此映射中
SCENE_TO_AI_SCENE = {
    "general_chat": "chat_model",
    "case_chat": "chat_model",
    "cause_analysis": "chat_model",
    "discretion_analysis": "chat_model",
    "violation_analysis": "chat_model",
    "interrogation_strategy": "chat_model",
    "knowledge_search": "chat_model",
    "knowledge_chat": "chat_model",
    "title_generation": "chat_model",
}


def _get_llm_config(temperature: float = 0.7, scene_key: str = "") -> dict:
    """获取 LLM 配置（优先从 system_configs 动态读取，fallback 到 .env）"""
    # 基础配置（fallback）
    base = {
        "model": LLM_MODEL,
        "base_url": LLM_API_BASE,
        "api_key": LLM_API_KEY,
        "temperature": temperature,
    }

    # 尝试从 system_configs 读取动态配置
    try:
        from app.core.config import get_ai_scene_config
        import asyncio

        ai_scene = SCENE_TO_AI_SCENE.get(scene_key, "chat_model")

        # 尝试获取已有事件循环
        try:
            loop = asyncio.get_running_loop()
        except RuntimeError:
            loop = None

        if loop is None:
            # 无事件循环，可以直接 run
            config = asyncio.run(get_ai_scene_config(ai_scene))
        else:
            # 在已有事件循环中，创建任务
            import concurrent.futures
            with concurrent.futures.ThreadPoolExecutor() as pool:
                config = pool.submit(asyncio.run, get_ai_scene_config(ai_scene)).result(timeout=5)

        if config and config.get("model") and config.get("api_base"):
            decrypted_key = config.get("api_key_decrypted") or config.get("api_key", "")
            return {
                "model": config["model"],
                "base_url": config["api_base"],
                "api_key": decrypted_key or LLM_API_KEY,
                "temperature": temperature,
            }
    except Exception as e:
        pass  # fallback to .env settings

    return base


def get_dynamic_llm_config(scene_key: str) -> dict:
    """动态获取 LLM 配置 — 优先从 system_configs 读取"""
    ai_scene = SCENE_TO_AI_SCENE.get(scene_key, "chat_model")
    temp = SCENE_TEMPERATURE_MAP.get(scene_key, 0.7)

    # 尝试从缓存读取
    try:
        from app.core.config import get_ai_scene_config
        import asyncio
        loop = None
        try:
            loop = asyncio.get_running_loop()
        except RuntimeError:
            loop = None

        if loop and loop.is_running():
            # 在已有事件循环中，无法直接 await，使用缓存
            from app.core.model_resolver import get_active_embedding_config, get_active_rerank_config
            # 同步返回基础配置，engine 会在初始化时处理
            return _get_llm_config(temp, scene_key)
        else:
            config = asyncio.run(get_ai_scene_config(ai_scene))
            if config and config.get("api_key_decrypted"):
                return {
                    "model": config.get("model", LLM_MODEL),
                    "base_url": config.get("api_base", LLM_API_BASE),
                    "api_key": config.get("api_key_decrypted", LLM_API_KEY),
                    "temperature": temp,
                }
    except Exception:
        pass

    return _get_llm_config(temp, scene_key)


# 保持 SCENE_MODEL_MAP 兼容（使用温度映射）
SCENE_MODEL_MAP = {
    scene: _get_llm_config(SCENE_TEMPERATURE_MAP.get(scene, 0.7), scene)
    for scene in SCENE_TEMPERATURE_MAP
}

# ==================== Agent 定义 ====================
# 4个专业Agent，通过不同system prompt区分

AGENT_SOULS = {
    "general-assistant": """你是综合执法智能助手，一名专业的行政执法辅助AI。
你的职责是协助执法人员完成日常执法工作，包括法律咨询、案件分析、文书辅助等。
你具备丰富的法律知识，熟悉行政处罚法、行政强制法等基础法律，以及各行业专项法规。""",

    "violation-analysis": """你是违法分析专家，专注于行政执法领域的违法行为认定和处罚裁量。
你的核心能力：
1. 根据违法事实，精准识别适用的法律条款
2. 分析违法行为的性质、情节和社会危害程度
3. 提供结构化的案由分析结果
4. 给出处罚裁量建议，包括处罚种类、幅度和依据
你必须严格按照法律条文进行分析，不得主观臆断。""",

    "document-generation": """你是文书生成专家，专注于行政执法文书的起草和生成。
你的核心能力：
1. 根据案件信息匹配合适的文书模板
2. 按照法定格式和要求填写文书内容
3. 确保文书的法律效力和规范性
4. 支持处罚决定书、询问笔录、立案审批表等多种文书类型
你必须确保生成的文书内容准确、格式规范、法律依据充分。""",

    "interrogation-strategy": """你是询问策略专家，专注于行政执法询问环节的策略规划。
你的核心能力：
1. 根据案件类型和违法事实制定询问提纲
2. 设计针对性的询问问题和策略
3. 预判可能的回答并准备追问方向
4. 确保询问过程合法合规
你的策略必须基于7大底层策略+4行业模块+6案情适配的架构。""",
}

# 场景→Agent映射
SCENE_AGENT_MAP = {
    "general_chat": "general-assistant",
    "case_chat": "general-assistant",
    "cause_analysis": "violation-analysis",
    "discretion_analysis": "violation-analysis",
    "violation_analysis": "violation-analysis",
    "interrogation_strategy": "interrogation-strategy",
    "document_generation": "document-generation",
    "knowledge_search": "general-assistant",
    "knowledge_chat": "general-assistant",
    "title_generation": "general-assistant",
}

# 轻量模型配置（用于标题生成、摘要等辅助任务）
LIGHTWEIGHT_MODEL_CONFIG = _get_llm_config(0.3)
