/**
 * find-config.js — OpenClaw 配置文件定位 & 读写工具
 * 
 * 通用能力：跨平台自动查找 ~/.openclaw/openclaw.json
 * 所有需要读写 openclaw.json 的模块都应该调用这个工具
 * 
 * 使用:
 *   const { findConfig, readConfig, writeConfig, patchConfig } = require('./find-config');
 *   
 *   const configPath = findConfig();                    // 返回路径或 null
 *   const config = readConfig();                        // 读取 JSON 对象
 *   writeConfig(config);                                // 写回整个 JSON
 *   patchConfig({ session: { reset: { mode: 'idle' } } }); // 深度合并局部字段
 */

const fs = require('fs');
const path = require('path');
const os = require('os');

const CONFIG_FILENAME = 'openclaw.json';

/**
 * 查找 openclaw.json 的路径
 * 按优先级尝试：
 *   1. ~/.openclaw/openclaw.json（标准路径）
 *   2. 环境变量 OPENCLAW_HOME 指定的目录
 * 
 * @returns {string|null} 配置文件路径，未找到返回 null
 */
function findConfig() {
  const candidates = [];

  // 1. 环境变量优先
  if (process.env.OPENCLAW_HOME) {
    candidates.push(path.join(process.env.OPENCLAW_HOME, CONFIG_FILENAME));
  }

  // 2. 标准路径 ~/.openclaw/
  candidates.push(path.join(os.homedir(), '.openclaw', CONFIG_FILENAME));

  // 3. Windows WSL 下 /root/.openclaw/
  if (os.platform() === 'linux') {
    candidates.push(path.join('/root', '.openclaw', CONFIG_FILENAME));
  }

  for (const p of candidates) {
    try {
      if (fs.existsSync(p)) {
        return p;
      }
    } catch {}
  }

  return null;
}

/**
 * 读取 openclaw.json 并解析为 JSON 对象
 * @returns {{ config: object, configPath: string }}
 * @throws {Error} 未找到或解析失败
 */
function readConfig() {
  const configPath = findConfig();
  if (!configPath) {
    throw new Error('未找到 openclaw.json，请确认 OpenClaw 已安装');
  }

  const raw = fs.readFileSync(configPath, 'utf8');
  const config = JSON.parse(raw);
  return { config, configPath };
}

/**
 * 写入完整的 config 对象到 openclaw.json
 * @param {object} config - 完整的配置对象
 * @param {string} [configPath] - 可选路径，不传则自动查找
 */
function writeConfig(config, configPath) {
  if (!configPath) {
    configPath = findConfig();
    if (!configPath) {
      throw new Error('未找到 openclaw.json，无法写入');
    }
  }

  fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
}

/**
 * 深度合并 patch 到现有配置（只改指定字段，不影响其他）
 * @param {object} patch - 要合并的局部配置
 * @returns {{ config: object, configPath: string }} 合并后的结果
 */
function patchConfig(patch) {
  const { config, configPath } = readConfig();
  deepMerge(config, patch);
  writeConfig(config, configPath);
  return { config, configPath };
}

/**
 * 深度合并 source 到 target（就地修改）
 */
function deepMerge(target, source) {
  for (const key of Object.keys(source)) {
    if (
      source[key] !== null &&
      typeof source[key] === 'object' &&
      !Array.isArray(source[key]) &&
      target[key] !== null &&
      typeof target[key] === 'object' &&
      !Array.isArray(target[key])
    ) {
      deepMerge(target[key], source[key]);
    } else {
      target[key] = source[key];
    }
  }
}

module.exports = { findConfig, readConfig, writeConfig, patchConfig, deepMerge };
