/**
 * AgentContext - Agent 级别的上下文封装
 *
 * 职责：
 * 1. 隔离不同 Agent 实例的状态
 * 2. 管理 Agent 级工具注册
 * 3. 管理 Agent 级技能
 * 4. 管理 Agent 级系统提示词
 */

class AgentContext {
  /**
   * @param {string} agentId - Agent ID
   * @param {Agent} agent - Agent 实例引用
   * @param {Object} options - 配置选项
   */
  constructor(agentId, agent, options = {}) {
    this.agentId = agentId;
    this.agent = agent; // Agent 实例引用

    this.name = options.name || agent?.name || agentId;

    // Agent 级工具注册（覆盖全局）
    this.tools = new Map();

    // Agent 级技能
    this.skills = [];

    // Agent 级系统提示词
    this.systemPrompt = null;

    // 自定义数据
    this.customData = new Map();

    // 元数据
    this.metadata = {
      createdAt: Date.now(),
      lastActive: Date.now(),
    };
  }

  // ==================== 工具管理 ====================

  /**
   * 注册工具
   * @param {Object} toolDef - 工具定义
   */
  registerTool(toolDef) {
    this.tools.set(toolDef.name, toolDef);
  }

  /**
   * 批量注册工具
   * @param {Array<Object>} toolDefs - 工具定义数组
   */
  registerTools(toolDefs) {
    for (const toolDef of toolDefs) {
      this.registerTool(toolDef);
    }
  }

  /**
   * 注销工具
   * @param {string} name - 工具名
   */
  unregisterTool(name) {
    this.tools.delete(name);
  }

  /**
   * 获取工具
   * @param {string} name - 工具名
   * @returns {Object|null}
   */
  getTool(name) {
    return this.tools.get(name) || null;
  }

  /**
   * 获取所有工具
   * @returns {Array}
   */
  getAllTools() {
    return Array.from(this.tools.values());
  }

  /**
   * 检查是否有工具
   * @param {string} name - 工具名
   * @returns {boolean}
   */
  hasTool(name) {
    return this.tools.has(name);
  }

  // ==================== 技能管理 ====================

  /**
   * 添加技能
   * @param {Object} skill - 技能对象
   */
  addSkill(skill) {
    this.skills.push(skill);
  }

  /**
   * 移除技能
   * @param {string} skillName - 技能名
   */
  removeSkill(skillName) {
    this.skills = this.skills.filter((s) => s.name !== skillName);
  }

  /**
   * 获取所有技能
   * @returns {Array}
   */
  getAllSkills() {
    return [...this.skills];
  }

  // ==================== 系统提示词 ====================

  /**
   * 设置系统提示词
   * @param {string} prompt - 提示词
   */
  setSystemPrompt(prompt) {
    this.systemPrompt = prompt;
  }

  /**
   * 获取系统提示词
   * @returns {string|null}
   */
  getSystemPrompt() {
    return this.systemPrompt;
  }

  // ==================== 自定义数据 ====================

  /**
   * 设置自定义数据
   * @param {string} key - 键
   * @param {*} value - 值
   */
  setCustomData(key, value) {
    this.customData.set(key, value);
  }

  /**
   * 获取自定义数据
   * @param {string} key - 键
   * @param {*} defaultValue - 默认值
   * @returns {*}
   */
  getCustomData(key, defaultValue = undefined) {
    return this.customData.get(key) ?? defaultValue;
  }

  /**
   * 删除自定义数据
   * @param {string} key - 键
   */
  deleteCustomData(key) {
    this.customData.delete(key);
  }

  // ==================== 生命周期 ====================

  /**
   * 更新最后活跃时间
   */
  touch() {
    this.metadata.lastActive = Date.now();
  }

  /**
   * 销毁
   */
  destroy() {
    this.tools.clear();
    this.skills = [];
    this.customData.clear();
  }
}

module.exports = { AgentContext };
