const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
/**
 * Gemini web_search 请求适配（作用于 Gemini 请求 payload，而不是 ChatEnvelope）：
 *
 * - 仅在 routeId 以 `web_search` 或 `search` 开头时生效（来自 AdapterContext.routeId）；
 * - 针对 Gemini 请求中的 `tools` 字段进行清洗：
 *   - 保留 name === 'web_search' 的 functionDeclarations（如果存在）；
 *   - 丢弃其它 Codex 自身工具（exec_command / MCP 等），避免 Cloud Code 报
 *     “Multiple tools are supported only when they are all search tools.”；
 *   - 如果清洗后没有任何工具，则删除 `tools` 字段。
 *
 * 注意：
 * - 这里处理的是 llmswitch-core 为 gemini-chat 构造的中间 payload（buildGeminiRequestFromChat 输出）；
 * - 对于 Gemini CLI 后续在传输层添加的 googleSearch 工具，本适配不负责构造或修改。
 */
export function applyGeminiWebSearchCompat(payload, adapterContext) {
    const routeId = typeof adapterContext?.routeId === 'string' ? adapterContext.routeId : '';
    const normalizedRoute = routeId.trim().toLowerCase();
    // Some hosts/configs use "search" as the route name for web search engines.
    // Treat both "web_search*" and "search*" as web-search routes.
    if (!normalizedRoute || (!normalizedRoute.startsWith('web_search') && !normalizedRoute.startsWith('search'))) {
        return payload;
    }
    const cloned = { ...payload };
    // 对于 Gemini Chat 后端，请求根节点不支持自定义 `web_search` 字段，
    // 统一在 compat 层移除，避免触发
    // "Unknown name \"web_search\" at 'request': Cannot find field." 错误。
    if (cloned.web_search !== undefined) {
        delete cloned.web_search;
    }
    const toolsRaw = cloned.tools;
    // 当 web_search 路由下完全没有 tools 时，为 Gemini 搜索模型注入最小 googleSearch 工具，
    // 保持与 gcli2api 类似的“搜索模型自动启用 Search 工具”行为。
    if (!Array.isArray(toolsRaw)) {
        cloned.tools = [{ googleSearch: {} }];
        return cloned;
    }
    const nextTools = [];
    for (const entry of toolsRaw) {
        if (!isRecord(entry))
            continue;
        // 1) 保留 name === 'web_search' 的 functionDeclarations（单函数声明）。
        const decls = Array.isArray(entry.functionDeclarations)
            ? entry.functionDeclarations
            : [];
        const webSearchDecls = decls.filter((fn) => {
            if (!isRecord(fn))
                return false;
            const name = typeof fn.name === 'string' ? fn.name.trim().toLowerCase() : '';
            return name === 'web_search';
        });
        if (webSearchDecls.length) {
            nextTools.push({
                functionDeclarations: webSearchDecls
            });
            continue;
        }
        // 2) 若上游已经构造了 googleSearch 工具，则保留。
        if (isRecord(entry.googleSearch)) {
            nextTools.push({ googleSearch: entry.googleSearch });
        }
    }
    if (nextTools.length > 0) {
        cloned.tools = nextTools;
    }
    else {
        // 3) 清洗后没有任何工具时，再次注入一个最小 googleSearch 工具，确保搜索模型仍然启用 Search。
        cloned.tools = [{ googleSearch: {} }];
    }
    return cloned;
}
