/**
 * ============================================================
 *  src/utils/zodToJson.ts —— Zod schema → JSON Schema 自动派生
 * ------------------------------------------------------------
 *  封装 zod-to-json-schema，统一清理输出格式。
 *
 *  设计原则：
 *    - 单一数据源：每个工具只写一份 Zod schema
 *    - 自动派生：parameters（给 LLM 看的 JSON Schema）由 Zod 自动生成
 *    - 消除冗余：不再需要手写两份重复的参数定义
 * ============================================================
 */
import { zodToJsonSchema } from 'zod-to-json-schema';
/**
 * 把 zodToJsonSchema 输出的 draft-04 boolean 形式 exclusiveMin/Max 升级为
 * draft-2020-12 number 形式，让生成的 schema 在严校验 LLM provider 也能通过。
 *
 * 背景：`target: 'openApi3'` 走 OpenAPI 3.0 / JSON Schema draft-04 规范，
 *   `.positive()` 之类的 Zod 约束生成 `{minimum: 0, exclusiveMinimum: true}`。
 * 严校验 provider（如火山 ARK Coding 后挂的 GLM-5.1）按 draft-2020-12 要求
 *   `exclusiveMinimum` 必须是 number，遇 boolean 直接 400 InvalidParameter。
 *
 * 转换规则：
 *   {minimum: N, exclusiveMinimum: true}  →  {exclusiveMinimum: N}
 *   {maximum: N, exclusiveMaximum: true}  →  {exclusiveMaximum: N}
 *
 * Fallback：boolean 形式但同级没有 minimum/maximum 时（理论 edge case），
 *   静默删除 boolean 字段——避免污染 schema，运行时 Zod 兜底校验。
 */
function modernizeExclusiveBounds(node) {
    if (Array.isArray(node))
        return node.map(modernizeExclusiveBounds);
    if (node === null || typeof node !== 'object')
        return node;
    const obj = node;
    const out = {};
    for (const [k, v] of Object.entries(obj)) {
        if (k === 'exclusiveMinimum' && typeof v === 'boolean') {
            if (v && typeof obj.minimum === 'number')
                out.exclusiveMinimum = obj.minimum;
            continue;
        }
        if (k === 'minimum' && obj.exclusiveMinimum === true)
            continue;
        if (k === 'exclusiveMaximum' && typeof v === 'boolean') {
            if (v && typeof obj.maximum === 'number')
                out.exclusiveMaximum = obj.maximum;
            continue;
        }
        if (k === 'maximum' && obj.exclusiveMaximum === true)
            continue;
        out[k] = modernizeExclusiveBounds(v);
    }
    return out;
}
/**
 * 从 Zod schema 派生出 OpenAI tools[] 兼容的 JSON Schema 对象。
 *
 * 做了以下清理：
 *   - 移除 `$schema` 元数据字段（LLM 不需要）
 *   - `additionalProperties` 默认 false（防止模型传多余字段）
 *   - `modernizeExclusiveBounds` 把 boolean exclusiveMin/Max 升级 draft-2020-12 number 形式
 */
export function toToolParameters(schema) {
    const json = zodToJsonSchema(schema, {
        target: 'openApi3',
        $refStrategy: 'none',
    });
    // 移除 LLM 不需要的元数据
    const { $schema, ...rest } = json;
    return modernizeExclusiveBounds(rest);
}
