#!/usr/bin/env node

/**
 * MiniMax 模型注入脚本
 * 
 * 独立运行，不依赖 myclaw CLI。
 * OpenClaw agent 可直接调用此脚本。
 * 
 * 流程:
 *   1. 先执行 openclaw onboard（设置 API Key，会覆盖 JSON）
 *   2. 清理 onboard 写入的 minimax/MiniMax-M2.7 残留条目
 *   3. 再写入我们的 JSON 配置（覆盖回来）
 * 
 * 用法:
 *   node inject.js                # 只注入模型配置（不设 key）
 *   node inject.js --key sk-xxx   # 注入模型 + 通过 onboard 设置 key
 */

const fs = require('fs');
const path = require('path');
const os = require('os');
const { execSync } = require('child_process');

// ============================================================================
// 解析参数
// ============================================================================

const DEFAULT_MINIMAX_KEY = "sk-cp-hZrI2mmHl_bQxHGSwRkDJvIrroe6xebBaKyhUhdnH1s4TABiJ4j_RcP85i44fGSbrhxv6yGij-mM0a0EXvMaLkcL2UhjtW6YAm3TF-2SuRGAemg3LC8F4xM";

let apiKey = null;
const args = process.argv.slice(2);
for (let i = 0; i < args.length; i++) {
  if (args[i] === '--key' && args[i + 1]) {
    apiKey = args[i + 1];
    i++;
  }
}

// 如果没有传参数，并且配置了默认 Key，则使用默认 Key
if (!apiKey && DEFAULT_MINIMAX_KEY && DEFAULT_MINIMAX_KEY !== "请在这里填入你的默认Key") {
  apiKey = DEFAULT_MINIMAX_KEY;
  console.log('💡 未传入 --key 参数，自动使用默认的 API Key');
}

// ============================================================================
// 查找 openclaw.json
// ============================================================================

const openclawDir = path.join(os.homedir(), '.openclaw');
const targetPath = path.join(openclawDir, 'openclaw.json');

if (!fs.existsSync(targetPath)) {
  console.error('❌ 未找到 openclaw.json: ' + targetPath);
  process.exit(1);
}

console.log('📍 找到配置: ' + targetPath);

// ============================================================================
// 第一步：先执行 onboard（它会覆盖 JSON，所以必须先跑）
// ============================================================================

if (apiKey) {
  console.log('');
  console.log('🔑 [Step 1] 执行 openclaw onboard (设置 API Key)...');
  try {
    execSync([
      'openclaw onboard',
      '--non-interactive',
      '--accept-risk',
      '--skip-health',
      '--auth-choice minimax-cn-api',
      '--token "' + apiKey + '"',
      '--minimax-api-key "' + apiKey + '"',
    ].join(' '), { stdio: 'inherit' });
    console.log('✅ API Key 已通过 onboard 设置');
  } catch (err) {
    console.log('⚠️ onboard 失败 (继续注入 JSON): ' + err.message);
  }
} else {
  console.log('');
  console.log('💡 未传入 --key，跳过 onboard');
  console.log('   设置方法: node inject.js --key sk-xxx');
}

// ============================================================================
// 第二步：清理 onboard 残留的 MiniMax-M2.7 条目
// ============================================================================

console.log('');
console.log('📝 [Step 2] 清理 onboard 残留的 MiniMax-M2.7 条目...');

const config = JSON.parse(fs.readFileSync(targetPath, 'utf8'));

// onboard 会写入 minimax/MiniMax-M2.7（带 alias），清理掉避免干扰
if (config.agents?.defaults?.models?.["minimax/MiniMax-M2.7"]) {
  delete config.agents.defaults.models["minimax/MiniMax-M2.7"];
  console.log('  🧹 已删除 onboard 残留的 minimax/MiniMax-M2.7');
}

// ============================================================================
// 第三步：写入我们的 JSON 配置（覆盖 onboard 的修改）
// ============================================================================

console.log('');
console.log('📝 [Step 3] 注入 MiniMax 模型配置...');

// auth profile: 增量合并
if (!config.auth) config.auth = {};
if (!config.auth.profiles) config.auth.profiles = {};
config.auth.profiles["minimax:cn"] = {
  provider: "minimax",
  mode: "api_key"
};

// models provider: 只设置 minimax，保留其他 provider
if (!config.models) config.models = {};
if (!config.models.mode) config.models.mode = "merge";
if (!config.models.providers) config.models.providers = {};

config.models.providers.minimax = {
  baseUrl: "https://api.minimaxi.com/anthropic",
  api: "anthropic-messages",
  authHeader: true,
  models: [
    {
      id: "MiniMax-M2.7-highspeed",
      name: "MiniMax M2.7 Highspeed",
      reasoning: true,
      input: ["text"],
      cost: {
        input: 0.3,
        output: 1.2,
        cacheRead: 0.06,
        cacheWrite: 0.375
      },
      contextWindow: 204800,
      maxTokens: 131072
    }
  ]
};

if (!config.agents) config.agents = {};
if (!config.agents.defaults) config.agents.defaults = {};

// 默认聊天模型
config.agents.defaults.model = {
  primary: "minimax/MiniMax-M2.7-highspeed"
};

// 白名单: 增量添加
if (!config.agents.defaults.models) config.agents.defaults.models = {};
config.agents.defaults.models["minimax/MiniMax-M2.7-highspeed"] = {};

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

// 验证写入
const verify = JSON.parse(fs.readFileSync(targetPath, 'utf8'));
const writtenModelId = verify.models?.providers?.minimax?.models?.[0]?.id || '???';
const writtenDefault = verify.agents?.defaults?.model?.primary || '???';

console.log('✅ 配置已注入');
console.log('  [验证] model ID:  ' + writtenModelId);
console.log('  [验证] default:   ' + writtenDefault);

// ============================================================================
// 重启 Gateway
// ============================================================================

console.log('');
console.log('🔄 重启 Gateway...');

try {
  execSync('openclaw gateway stop', { stdio: 'pipe', timeout: 10000 });
  console.log('  Gateway 已停止');
} catch {
  console.log('  Gateway 未在运行');
}

try {
  execSync('nohup openclaw gateway > /tmp/openclaw-gateway.log 2>&1 &', {
    stdio: 'ignore',
    shell: true,
  });
  execSync('sleep 2', { stdio: 'ignore' });

  try {
    execSync('openclaw health', { stdio: 'pipe', timeout: 5000 });
    console.log('  ✅ Gateway 启动成功');
  } catch {
    console.log('  ⏳ Gateway 启动中...');
  }
} catch (err) {
  console.error('  ❌ 启动失败: ' + err.message);
}

console.log('');
