"""
MCP资源处理器
使用依赖注入获取服务实例
"""
import json
from typing import Optional, TYPE_CHECKING
from loguru import logger

from mcp.types import Resource

if TYPE_CHECKING:
    from src.services import RAGService


class MCPResourcesHandler:
    """
    MCP资源处理器
    
    支持依赖注入，可以接受外部传入的 RAGService 实例。
    """
    
    def __init__(self, rag_service: Optional["RAGService"] = None):
        """
        初始化资源处理器
        
        Args:
            rag_service: RAGService 实例（可选）。
                        如果未提供，将从依赖注入容器获取。
        """
        if rag_service is None:
            from src.di import get_container
            container = get_container()
            rag_service = container.get("rag_service")
        
        self.service = rag_service
    
    @staticmethod
    def format_error(error: Exception) -> str:
        """格式化错误信息"""
        return f"错误: {type(error).__name__} - {str(error)}"
    
    def list_resources(self) -> list[Resource]:
        """列出所有可用的资源"""
        return [
            Resource(
                uri="config://system",
                name="系统配置",
                description="RAG系统的配置信息，包括模型、API、检索参数等",
                mimeType="application/json"
            ),
            Resource(
                uri="stats://index",
                name="索引统计",
                description="索引的统计信息，包括向量索引和BM25索引的状态",
                mimeType="application/json"
            ),
            Resource(
                uri="stats://index/verbose",
                name="索引详细统计",
                description="索引的详细统计信息，包括所有索引文件和配置",
                mimeType="application/json"
            )
        ]
    
    def read_resource(self, uri: str) -> str:
        """读取资源内容"""
        try:
            logger.info(f"读取资源: {uri}")
            
            if uri == "config://system":
                # 返回系统配置
                config_result = self.service.get_config()
                
                if config_result.get("success"):
                    result = {
                        "resource": "config://system",
                        "description": "RAG系统配置信息",
                        "config": config_result.get("config", {})
                    }
                else:
                    result = {
                        "resource": "config://system",
                        "error": config_result.get("error", "未知错误")
                    }
                
                return json.dumps(result, ensure_ascii=False, indent=2)
            
            elif uri == "stats://index":
                # 返回索引统计信息（简略）
                status_result = self.service.get_status(verbose=False)
                
                if status_result.get("success"):
                    result = {
                        "resource": "stats://index",
                        "description": "索引统计信息",
                        "stats": status_result.get("stats", {})
                    }
                else:
                    result = {
                        "resource": "stats://index",
                        "error": status_result.get("error", "未知错误")
                    }
                
                return json.dumps(result, ensure_ascii=False, indent=2)
            
            elif uri == "stats://index/verbose":
                # 返回索引详细统计信息
                status_result = self.service.get_status(verbose=True)
                
                if status_result.get("success"):
                    result = {
                        "resource": "stats://index/verbose",
                        "description": "索引详细统计信息",
                        "stats": status_result.get("stats", {}),
                        "verbose": True
                    }
                else:
                    result = {
                        "resource": "stats://index/verbose",
                        "error": status_result.get("error", "未知错误")
                    }
                
                return json.dumps(result, ensure_ascii=False, indent=2)
            
            else:
                return json.dumps({
                    "error": f"未知资源: {uri}",
                    "available_resources": [
                        "config://system",
                        "stats://index",
                        "stats://index/verbose"
                    ]
                }, ensure_ascii=False, indent=2)
        
        except Exception as e:
            logger.error(f"读取资源失败: {e}")
            import traceback
            logger.error(traceback.format_exc())
            
            return json.dumps({
                "error": self.format_error(e),
                "traceback": traceback.format_exc()
            }, ensure_ascii=False, indent=2)
