/**
 * ============================================================================
 * MyClaw - Create Agent 模块
 * ============================================================================
 * 
 * 创建 OpenClaw Agent 的完整逻辑
 * 
 * 功能:
 * - 标准化 agent ID
 * - 检查重复
 * - 创建工作空间目录和默认文件
 * - 更新 OpenClaw 配置文件
 * - 发送出生消息
 * 
 * ============================================================================
 */

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

// ============================================================================
// 路径工具
// ============================================================================

function normalizePath(p) {
  return p.replace(/\\/g, '/');
}

function ensureDir(dirPath) {
  if (!fs.existsSync(dirPath)) {
    fs.mkdirSync(dirPath, { recursive: true });
  }
}

function writeIfAbsent(filePath, content) {
  if (!fs.existsSync(filePath)) {
    fs.writeFileSync(filePath, content, 'utf8');
  }
}

// ============================================================================
// 工具函数
// ============================================================================

function fail(msg, code = 1) {
  console.error('[错误] ' + msg);
  process.exit(code);
}

/**
 * 标准化 agent ID
 * - 转小写
 * - 非法字符替换为连字符
 * - 去除多余连字符
 */
function normalizeAgentId(raw) {
  let value = raw.trim().toLowerCase();
  value = value.replace(/[^a-z0-9-]/g, '-');
  value = value.replace(/-{2,}/g, '-').replace(/^-|-$/g, '');
  return value;
}

/**
 * 验证 agent ID
 */
function validateAgentId(agentId) {
  if (!agentId) {
    fail('Agent 名称标准化后为空，请检查输入。');
  }
  if (agentId.length > 64) {
    fail('Agent ID 太长，请保持在 64 个字符以内。');
  }
  if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(agentId)) {
    fail('Agent ID 只能包含小写字母、数字和连字符（不能以连字符开头或结尾）。');
  }
}

/**
 * 生成北京时间出生消息
 */
function buildBirthMessage() {
  const nowUtc = new Date();
  const nowBj = new Date(nowUtc.getTime() + 8 * 60 * 60 * 1000);
  const y = nowBj.getUTCFullYear();
  const m = nowBj.getUTCMonth() + 1;
  const d = nowBj.getUTCDate();
  const h = String(nowBj.getUTCHours()).padStart(2, '0');
  const min = String(nowBj.getUTCMinutes()).padStart(2, '0');
  const ts = `${y}年${m}月${d}日${h}:${min}`;
  return `你好，你的生日是北京时间${ts}，请记录这个信息。`;
}

/**
 * 从当前 workspace 模板目录复制默认文件，替换 agentId
 * SOUL.md 使用 inject-workspaceAndSoul.js 中的学习伙伴模板
 */
function defaultWorkspaceFiles(agentId) {
  const templateDir = path.resolve(__dirname, '..');
  const templateFiles = ['AGENTS.md', 'USER.md', 'IDENTITY.md', 'HEARTBEAT.md', 'BOOTSTRAP.md'];
  const files = {};

  // 从根 workspace 复制其他文件
  for (const fn of templateFiles) {
    const src = path.join(templateDir, fn);
    if (fs.existsSync(src)) {
      let content = fs.readFileSync(src, 'utf8');
      content = content.replace(/yiranclaw/g, agentId);
      files[fn] = content;
    }
  }

  // SOUL.md 使用学生学习伙伴模板
  const soulModule = require('./injects/inject-workspaceAndSoul');
  // 直接读取模块里的 SOUL_CONTENT（不依赖导出，直接读源文件更可靠）
  const soulSrc = path.join(__dirname, 'injects/inject-workspaceAndSoul.js');
  if (fs.existsSync(soulSrc)) {
    const raw = fs.readFileSync(soulSrc, 'utf8');
    const match = raw.match(/const SOUL_CONTENT = `([\s\S]*?)`;/);
    if (match) {
      files['SOUL.md'] = match[1];
    }
  }

  return files;
}

// ============================================================================
// 主函数
// ============================================================================

/**
 * 创建新的 OpenClaw Agent
 * 
 * @param {string} rawName - 原始名称
 * @returns {object} 创建结果
 */
function createAgent(rawName, opts) {
  opts = opts || {};
  // 标准化 & 验证名称
  const agentId = normalizeAgentId(rawName);
  validateAgentId(agentId);

  // 确定 OpenClaw 配置目录
  const homeDir = os.homedir();
  const openclawDir = path.join(homeDir, '.openclaw');
  const configPath = path.join(openclawDir, 'openclaw.json');
  const agentsDir = path.join(openclawDir, 'agents');
  const workspaceDir = path.join(openclawDir, 'workspace-' + agentId);
  const agentDir = path.join(agentsDir, agentId, 'agent');

  // 检查配置是否存在
  if (!fs.existsSync(configPath)) {
    fail('配置文件不存在: ' + normalizePath(configPath) + '\n请先运行 openclaw onboard 完成初始化。');
  }

  // 加载配置
  let configData;
  try {
    const raw = fs.readFileSync(configPath, 'utf8');
    configData = JSON.parse(raw);
  } catch (err) {
    fail('配置文件读取失败: ' + err.message);
  }

  // 确保 agents 结构存在
  if (!configData.agents) {
    configData.agents = {};
  }
  if (!Array.isArray(configData.agents.list)) {
    configData.agents.list = [];
  }

  // 检查重复 ID
  const existingIds = new Set(
    configData.agents.list
      .filter(e => e && typeof e === 'object')
      .map(e => e.id)
  );
  if (existingIds.has(agentId)) {
    fail('Agent "' + agentId + '" 已存在，请使用其他名称。');
  }

  // 检查目录冲突
  if (fs.existsSync(workspaceDir) || fs.existsSync(agentDir)) {
    fail(
      '工作空间或 Agent 目录已存在，请检查是否已有同名 Agent。\n' +
      'workspace=' + normalizePath(workspaceDir) + '\n' +
      'agentDir=' + normalizePath(agentDir)
    );
  }

  // 创建目录结构
  ensureDir(workspaceDir);
  ensureDir(agentDir);
  ensureDir(path.join(agentsDir, agentId, 'sessions'));

  // 创建默认工作空间文件
  const files = defaultWorkspaceFiles(agentId);
  for (const [filename, content] of Object.entries(files)) {
    writeIfAbsent(path.join(workspaceDir, filename), content);
  }

  // 备份配置
  const backupPath = configPath + '.bak.agent-birth.' + 
    new Date().toISOString().replace(/[:.]/g, '-').slice(0, 26) + 'Z';
  fs.copyFileSync(configPath, backupPath);

  // 添加 Agent 条目
  configData.agents.list.push({
    id: agentId,
    name: agentId,
    workspace: workspaceDir,
    agentDir: agentDir,
  });

  // 写入配置
  try {
    fs.writeFileSync(configPath, JSON.stringify(configData, null, 2) + '\n', 'utf8');
  } catch (err) {
    fail('配置文件写入失败: ' + err.message + '\n备份文件: ' + normalizePath(backupPath));
  }

  // 发送首条消息：发起后不等待，后续由后端服务处理
  const birthMessage = opts.firstMessage || buildBirthMessage();
  let firstMessageSent = false;

  try {
    const { spawn } = require('child_process');
    spawn('openclaw', ['agent', '--agent', agentId, '--message', birthMessage, '--json'], {
      detached: true,
      stdio: 'ignore',
      shell: true,
    }).unref();
    firstMessageSent = true;
  } catch (err) {
    firstMessageSent = false;
  }

  // 返回结果
  return {
    ok: true,
    agentId: agentId,
    sessionKey: 'agent:' + agentId + ':main',
    workspace: normalizePath(workspaceDir),
    agentDir: normalizePath(agentDir),
    configBackup: normalizePath(backupPath),
    birthMessage: birthMessage,
    firstMessageSent: firstMessageSent,
  };
}

module.exports = { createAgent, normalizeAgentId, validateAgentId };
