"""
物业智能助手Agent - 业主端交互入口

核心功能：
1. 语音识别：将业主的语音输入转换为文字
2. 意图理解：识别业主需要的服务类型
3. 任务创建：自动创建服务工单
4. 任务查询：查询工单状态
"""
import os
import json
from typing import Annotated
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langgraph.graph import MessagesState
from langgraph.graph.message import add_messages
from langchain_core.messages import AnyMessage
from coze_coding_utils.runtime_ctx.context import default_headers
from storage.memory.memory_saver import get_memory_saver
from tools.voice_tool import transcribe_audio
from tools.tts_tool import speak_to_user, get_available_voices
from tools.voice_session_tool import (
    start_voice_session,
    voice_chat,
    end_voice_session,
    get_voice_session_status
)
from tools.user_tool import get_or_create_user
from tools.task_tool import create_property_task, query_user_tasks, get_task_detail
from tools.knowledge_tool import search_knowledge
from tools.staff_tool import get_available_staff, assign_task_to_staff, update_task_status
from tools.wecom_tool import notify_staff_new_task, process_staff_feedback, simulate_staff_response
from tools.mall_tool import get_mall_categories, search_products, recommend_products, get_hot_deals, get_product_detail

LLM_CONFIG = "config/agent_llm_config.json"

# 默认保留最近 20 轮对话 (40 条消息)
MAX_MESSAGES = 40


def _windowed_messages(old, new):
    """滑动窗口: 只保留最近 MAX_MESSAGES 条消息"""
    return add_messages(old, new)[-MAX_MESSAGES:]  # type: ignore


class AgentState(MessagesState):
    messages: Annotated[list[AnyMessage], _windowed_messages]


def build_agent(ctx=None):
    """
    构建物业智能助手Agent
    
    参数:
        ctx: 运行时上下文（可选）
    
    返回:
        Agent实例
    """
    # 获取工作空间路径
    workspace_path = os.getenv("COZE_WORKSPACE_PATH", "/workspace/projects")
    config_path = os.path.join(workspace_path, LLM_CONFIG)

    # 读取配置文件
    with open(config_path, 'r', encoding='utf-8') as f:
        cfg = json.load(f)

    # 获取API配置
    api_key = os.getenv("COZE_WORKLOAD_IDENTITY_API_KEY")
    base_url = os.getenv("COZE_INTEGRATION_MODEL_BASE_URL")

    # 初始化LLM
    llm = ChatOpenAI(
        model=cfg['config'].get("model"),
        api_key=api_key,
        base_url=base_url,
        temperature=cfg['config'].get('temperature', 0.7),
        streaming=True,
        timeout=cfg['config'].get('timeout', 600),
        extra_body={
            "thinking": {
                "type": cfg['config'].get('thinking', 'disabled')
            }
        },
        default_headers=default_headers(ctx) if ctx else {}
    )

    # 工具列表
    tools = [
        # 语音工具
        transcribe_audio,
        speak_to_user,
        get_available_voices,
        # 语音会话工具（语音交互问答）
        start_voice_session,
        voice_chat,
        end_voice_session,
        get_voice_session_status,
        # 用户和任务工具
        get_or_create_user,
        create_property_task,
        query_user_tasks,
        get_task_detail,
        update_task_status,
        # 知识库搜索工具
        search_knowledge,
        # 物业人员管理工具
        get_available_staff,
        assign_task_to_staff,
        # 企业微信通知工具
        notify_staff_new_task,
        process_staff_feedback,
        simulate_staff_response,
        # 商城购物推荐工具
        get_mall_categories,
        search_products,
        recommend_products,
        get_hot_deals,
        get_product_detail
    ]

    # 创建Agent
    return create_agent(
        model=llm,
        system_prompt=cfg.get("sp"),
        tools=tools,
        checkpointer=get_memory_saver(),
        state_schema=AgentState,
    )
