"""
MCP提示词处理器
"""
from typing import Optional, Dict
from loguru import logger

from mcp.types import Prompt, PromptMessage, TextContent, GetPromptResult

from src.config import get_config_manager


class MCPPromptsHandler:
    """MCP提示词处理器"""
    
    @staticmethod
    def format_error(error: Exception) -> str:
        """格式化错误信息"""
        return f"错误: {type(error).__name__} - {str(error)}"
    
    def list_prompts(self) -> list[Prompt]:
        """列出所有可用的提示词模板"""
        return [
            Prompt(
                name="rag_query",
                description="RAG查询提示词模板。用于生成结构化的知识库查询请求。",
                arguments=[
                    {
                        "name": "question",
                        "description": "用户问题",
                        "required": True
                    },
                    {
                        "name": "mode",
                        "description": "检索模式：vector、bm25或hybrid",
                        "required": False
                    }
                ]
            )
        ]
    
    def get_prompt(self, name: str, arguments: Optional[Dict[str, str]] = None) -> GetPromptResult:
        """获取提示词内容"""
        try:
            logger.info(f"获取提示词: {name}, 参数: {arguments}")
            
            if name == "rag_query":
                question = arguments.get("question", "") if arguments else ""
                mode = arguments.get("mode", "hybrid") if arguments else "hybrid"
                
                if not question:
                    raise ValueError("缺少必需参数: question")
                
                # 获取配置
                config = get_config_manager()
                
                # 构建提示词消息
                prompt_text = f"""# RAG知识库查询

## 查询问题
{question}

## 检索模式
{mode}

## 说明
- 使用 {mode} 模式从知识库检索相关信息
- 基于检索结果生成准确、有条理的回答
- 如果知识库中没有相关信息，请明确告知用户
- 回答时引用具体的文档片段作为依据

## 系统提示
{config.system.system_prompt}
"""
                
                return GetPromptResult(
                    description=f"RAG查询: {question[:50]}...",
                    messages=[
                        PromptMessage(
                            role="user",
                            content=TextContent(
                                type="text",
                                text=prompt_text
                            )
                        )
                    ]
                )
            
            else:
                raise ValueError(f"未知提示词: {name}")
        
        except Exception as e:
            logger.error(f"获取提示词失败: {e}")
            import traceback
            logger.error(traceback.format_exc())
            
            # 返回错误信息作为提示词
            return GetPromptResult(
                description=f"错误: {name}",
                messages=[
                    PromptMessage(
                        role="user",
                        content=TextContent(
                            type="text",
                            text=f"错误: {self.format_error(e)}\n\n{traceback.format_exc()}"
                        )
                    )
                ]
            )
