# -*- coding: utf-8 -*-
"""
Schema 生成工具模块
"""

from typing import Any, Dict, List


def generate_input_schema(parameters: Dict[str, Any]) -> Dict[str, Any]:
    """
    从查询配置的参数定义生成 MCP 工具的 inputSchema
    
    此函数会保留完整的 JSON Schema 信息，包括：
    - type: Schema 类型（通常是 "object"）
    - required: 必填字段列表
    - properties: 属性定义（包括每个属性的 type, description, format, examples 等）
    - description: Schema 的整体描述（如果有）
    - 以及其他任何 JSON Schema 标准字段
    
    Args:
        parameters: 查询配置中的参数定义字典，应该是一个完整的 JSON Schema 对象
        
    Returns:
        Dict[str, Any]: 符合 JSON Schema 规范的 inputSchema 对象
    """
    # 如果 parameters 本身就是一个完整的 JSON Schema 对象，直接使用
    # 但确保至少包含 type 和 properties
    if not parameters:
        # 如果 parameters 为空，返回一个空的 object schema
        return {
            "type": "object",
            "properties": {},
            "required": []
        }
    
    # 深拷贝 parameters 以避免修改原始数据
    input_schema = dict(parameters)
    
    # 确保必需的字段存在
    if "type" not in input_schema:
        input_schema["type"] = "object"
    
    if "properties" not in input_schema:
        input_schema["properties"] = {}
    
    if "required" not in input_schema:
        input_schema["required"] = []
    
    return input_schema


def validate_input_schema(schema: Dict[str, Any]) -> tuple[bool, str]:
    """
    验证 inputSchema 是否符合基本的 JSON Schema 规范
    
    Args:
        schema: 要验证的 schema 对象
        
    Returns:
        tuple[bool, str]: (是否有效, 错误消息或成功消息)
    """
    if not isinstance(schema, dict):
        return False, "Schema 必须是一个字典对象"
    
    if schema.get("type") != "object":
        return False, "Schema 的 type 字段必须是 'object'"
    
    if "properties" not in schema:
        return False, "Schema 必须包含 properties 字段"
    
    if not isinstance(schema.get("properties"), dict):
        return False, "Schema 的 properties 字段必须是一个字典对象"
    
    # 验证 required 字段（如果存在）
    if "required" in schema:
        required = schema["required"]
        if not isinstance(required, list):
            return False, "Schema 的 required 字段必须是一个列表"
        
        # 验证所有 required 的字段都在 properties 中定义
        properties = schema["properties"]
        for field in required:
            if field not in properties:
                return False, f"必填字段 '{field}' 未在 properties 中定义"
    
    # 验证 properties 中每个字段的定义
    for prop_name, prop_def in schema["properties"].items():
        if not isinstance(prop_def, dict):
            return False, f"属性 '{prop_name}' 的定义必须是一个字典对象"
        
        if "type" not in prop_def:
            return False, f"属性 '{prop_name}' 必须包含 type 字段"
    
    return True, "Schema 验证通过"
