# -*- coding: utf-8 -*-
"""
模型管理 API —— 支持前端动态切换 LLM 模型版本

端点：
- GET  /api/model        获取当前模型和可用模型列表
- POST /api/model/switch 切换运行时模型
"""

from fastapi import APIRouter
from pydantic import BaseModel, Field

from api.model_config import (
    get_current_model,
    set_current_model,
    get_available_models,
    get_thinking_level,
    set_thinking_level,
    get_available_thinking_levels,
    invalidate_model_cache,
)

router = APIRouter(prefix="/model", tags=["模型管理"])


# ── 请求模型 ──

class ModelSwitchRequest(BaseModel):
    """模型切换请求"""
    model: str = Field(..., description="模型名称", examples=["deepseek-v4-pro", "deepseek-v4-flash"])


class ThinkingSwitchRequest(BaseModel):
    """思考级别切换请求"""
    level: str = Field(..., description="思考级别", examples=["off", "high", "highest"])


# ── GET /api/model ──

@router.get("")
async def get_model_info():
    """获取当前模型、思考级别和可用列表。"""
    return {
        "current": get_current_model(),
        "available": get_available_models(),
        "thinking_level": get_thinking_level(),
        "thinking_levels": get_available_thinking_levels(),
    }


# ── POST /api/model/switch ──

@router.post("/switch")
async def switch_model(req: ModelSwitchRequest):
    """切换运行时模型。

    切换后会自动失效所有 chat_routes 下智能体的 Agent 缓存，
    下次请求时将使用新模型重新创建 Agent。

    注意：仅影响对话解读 / 配风计划审查智能体，
    click_routes 下的点选解读智能体不受影响。
    """
    model_name = req.model.strip()

    if model_name not in get_available_models():
        return {
            "error": f"不支持的模型: {model_name}",
            "available": get_available_models(),
        }

    # 1. 更新运行时模型配置
    set_current_model(model_name)

    # 2. 失效模型实例缓存
    invalidate_model_cache()

    # 3. 失效所有受影响的 Agent 单例缓存
    try:
        from agents.vent_agent import invalidate_dialog_cache
        invalidate_dialog_cache()
    except Exception as e:
        print(f"[模型切换] 失效 dialog_agent 缓存失败: {e}")

    try:
        from agents.review_agent import invalidate_cache
        invalidate_cache()
    except Exception as e:
        print(f"[模型切换] 失效 review_agent 缓存失败: {e}")

    print(f"[模型切换] 已切换到 {model_name}，所有受影响的 Agent 缓存已失效")

    return {
        "current": get_current_model(),
        "message": f"已切换到 {model_name}，下次请求生效",
    }


# ── POST /api/model/thinking ──

@router.post("/thinking")
async def switch_thinking(req: ThinkingSwitchRequest):
    """切换思考级别。

    切换后会自动失效所有 chat_routes 下智能体的 Agent 缓存，
    下次请求时将使用新思考级别重新创建模型实例。
    """
    level = req.level.strip().lower()

    if level not in get_available_thinking_levels():
        return {
            "error": f"不支持的思考级别: {level}",
            "available": get_available_thinking_levels(),
        }

    # 1. 更新思考级别（内部已清除模型实例缓存）
    try:
        set_thinking_level(level)
    except ValueError as e:
        return {"error": str(e), "available": get_available_thinking_levels()}

    # 2. 失效所有受影响的 Agent 单例缓存
    try:
        from agents.vent_agent import invalidate_dialog_cache
        invalidate_dialog_cache()
    except Exception as e:
        print(f"[思考切换] 失效 dialog_agent 缓存失败: {e}")

    try:
        from agents.review_agent import invalidate_cache
        invalidate_cache()
    except Exception as e:
        print(f"[思考切换] 失效 review_agent 缓存失败: {e}")

    print(f"[思考切换] 已切换到 {level}，所有受影响的 Agent 缓存已失效")

    return {
        "thinking_level": get_thinking_level(),
        "message": f"思考级别已切换为「{level}」，下次请求生效",
    }
