/**
 * `ffctk setup` —— 自动写入 Claude Code 的 settings.json statusLine 字段，
 * 让用户在 Claude Code session 里直接看到 ffctk 实时状态。
 *
 * 写入位置：~/.claude/settings.json
 * 字段：statusLine.command = "ffctk statusline"
 *
 * 安全：备份原 statusLine 到 ~/.claude/settings.json.ffctk-backup
 * `ffctk unsetup` 回滚。
 */
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { execSync } from 'child_process';

const CLAUDE_SETTINGS = path.join(os.homedir(), '.claude', 'settings.json');
const BACKUP_PATH = path.join(os.homedir(), '.claude', 'settings.json.ffctk-backup');

function getFfctkBinPath(): string {
  try {
    return execSync('which ffctk', { stdio: ['ignore', 'pipe', 'ignore'] })
      .toString()
      .trim();
  } catch {
    return process.execPath;
  }
}

export function setup() {
  const binPath = getFfctkBinPath();
  if (!fs.existsSync(CLAUDE_SETTINGS)) {
    fs.mkdirSync(path.dirname(CLAUDE_SETTINGS), { recursive: true });
    fs.writeFileSync(CLAUDE_SETTINGS, '{}\n');
  }

  const settings = JSON.parse(fs.readFileSync(CLAUDE_SETTINGS, 'utf8'));

  if (settings.statusLine && settings.statusLine.command !== `${binPath} statusline`) {
    // 备份原 statusLine
    fs.writeFileSync(BACKUP_PATH, JSON.stringify({ statusLine: settings.statusLine }, null, 2));
    console.log(`Backed up existing statusLine to ${BACKUP_PATH}`);
  }

  settings.statusLine = {
    type: 'command',
    command: `${binPath} statusline`,
    padding: 0,
  };

  fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2) + '\n');
  console.log(`✅ Wrote statusLine to ${CLAUDE_SETTINGS}`);
  console.log(`   command: ${binPath} statusline`);
  console.log(`\nOpen a new Claude Code session to see it. To preview now:\n   ${binPath} statusline`);
  console.log(`\nTo revert: ${binPath} unsetup`);
}

export function unsetup() {
  if (!fs.existsSync(CLAUDE_SETTINGS)) {
    console.log('No Claude settings.json found, nothing to do.');
    return;
  }
  const settings = JSON.parse(fs.readFileSync(CLAUDE_SETTINGS, 'utf8'));

  if (fs.existsSync(BACKUP_PATH)) {
    const backup = JSON.parse(fs.readFileSync(BACKUP_PATH, 'utf8'));
    settings.statusLine = backup.statusLine;
    console.log(`Restored statusLine from ${BACKUP_PATH}`);
    fs.unlinkSync(BACKUP_PATH);
  } else {
    delete settings.statusLine;
    console.log('Removed statusLine (no backup found).');
  }

  fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2) + '\n');
  console.log(`✅ Updated ${CLAUDE_SETTINGS}`);
}
