#!/usr/bin/env node

/**
 * ============================================================================
 * MyClaw Launch - 统一启动流程
 * ============================================================================
 *
 * 使用: myclaw launch
 *
 * 统一的启动链条，被 bat 脚本和 wsl2 安装器共同复用：
 *   Step 1: 更新 MyClaw（Linux 侧）
 *   Step 2: 执行 Patch（UI + Skills + Config）
 *   Step 3: 后台启动 OpenClaw Gateway
 *   Step 4: 打开浏览器控制台
 * ============================================================================
 */

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

const isWindows = os.platform() === 'win32';
const C = isWindows
  ? { r: '', g: '', y: '', b: '', nc: '' }
  : { r: '\x1b[31m', g: '\x1b[32m', y: '\x1b[33m', b: '\x1b[34m', nc: '\x1b[0m' };

const BAR = '============================================';

// ============================================================================
// Step 1: 更新 MyClaw
// ============================================================================

function stepUpdate() {
  console.log('[1/4] 更新 MyClaw...');

  try {
    const registry = 'https://registry.npmjs.org';
    const pkg = '@aiyiran/myclaw';
    const currentVersion = require('./package.json').version;

    const latestVersion = execSync(
      'npm view ' + pkg + ' version --registry ' + registry,
      { encoding: 'utf8', timeout: 15000 }
    ).trim();

    if (currentVersion === latestVersion) {
      console.log('      ' + C.g + '[OK]' + C.nc + ' 已是最新 v' + currentVersion);
    } else {
      console.log('      v' + currentVersion + ' → v' + latestVersion);
      const tarball = execSync(
        'npm view ' + pkg + ' dist.tarball --registry ' + registry,
        { encoding: 'utf8', timeout: 15000 }
      ).trim();
      execSync('npm install -g ' + tarball, { stdio: 'pipe', timeout: 60000 });
      console.log('      ' + C.g + '[OK]' + C.nc + ' 已升级到 v' + latestVersion);

      // 磁盘上的代码已更新，但当前进程内存中仍为旧版
      // 需要用新版代码重新执行 launch 流程
      if (!process.env.MYCLAW_RELAUNCHED) {
        console.log('      重新加载新版代码...');
        process.env.MYCLAW_RELAUNCHED = '1';
        try {
          execSync('myclaw launch', { stdio: 'inherit' });
        } catch {}
        process.exit(0);
      }
    }
  } catch (err) {
    console.log('      ' + C.y + '[跳过]' + C.nc + ' 更新失败 (非致命)');
  }
  console.log('');
}

// ============================================================================
// Step 2: 执行 Patch
// ============================================================================

function stepPatch() {
  console.log('[2/4] Patch...');
  try {
    execSync('node "' + path.join(__dirname, 'index.js') + '" patch', {
      stdio: 'inherit',
    });
    console.log('      ' + C.g + '[OK]' + C.nc);
  } catch (err) {
    console.log('      ' + C.y + '[跳过]' + C.nc + ' 注入失败: ' + err.message);
  }
  console.log('');
}

// ============================================================================
// Step 3 & 4: 启动 Gateway + 打开浏览器
// ============================================================================

function stepGatewayAndOpen() {
  console.log('[3/4] 启动 Gateway...');
  console.log('');
  console.log(BAR);
  console.log('  Gateway starting...');
  console.log('  关闭此窗口 = 停止服务');
  console.log(BAR);
  console.log('');

  // 后台启动 gateway
  const gateway = spawn('openclaw', ['gateway'], {
    stdio: 'inherit',
    detached: false,
  });

  // 打开浏览器（延时 3 秒确保 Gateway 充分启动）
  console.log('[4/4] 等待 3 秒后自动打开浏览器...');
  setTimeout(() => {
    try {
      execSync('node "' + path.join(__dirname, 'index.js') + '" open', {
        stdio: 'pipe',
        timeout: 10000,
      });
      console.log('      ' + C.g + '[OK] 浏览器已触发' + C.nc);
    } catch {
      console.log('      ' + C.y + '[跳过] 触发浏览器失败' + C.nc);
    }
  }, 3000);
  console.log('');

  // 等待 gateway 进程退出（关闭终端会终止）
  return new Promise((resolve) => {
    gateway.on('close', (code) => {
      console.log('');
      console.log('  Gateway 已退出。');
      resolve(code);
    });
  });
}

// ============================================================================
// 主入口
// ============================================================================

async function run() {
  const bar = '----------------------------------------';

  console.log('');
  console.log('[' + C.b + 'MyClaw' + C.nc + '] ' + C.b + '启动流程' + C.nc);
  console.log(bar);
  console.log('');

  stepUpdate();
  stepPatch();
  await stepGatewayAndOpen();
}

module.exports = { run };
