/**
 * WorkerAgent - 独立子Agent
 * 用于Coordinator模式下的Worker，具有独立工具集
 * 任务完成后通过事件通知Coordinator
 */

const { Agent } = require('./agent');
const { EventEmitter } = require('../utils/event-emitter');

class WorkerAgent extends Agent {
  /**
   * @param {Framework} framework - 框架实例
   * @param {Object} config - 配置
   * @param {string} config.workerId - Worker唯一ID
   * @param {string} config.coordinatorId - Coordinator的agentId
   * @param {string} [config.name] - Worker名称
   * @param {string} [config.systemPrompt] - 系统提示
   * @param {string[]} [config.tools] - 可用工具名称列表（为空则无工具）
   */
  constructor(framework, config) {
    super(framework, {
      name: config.name || `worker_${config.workerId}`,
      systemPrompt: config.systemPrompt || WorkerAgent.defaultPrompt(),
      model: config.model,
      provider: config.provider,
      apiKey: config.apiKey,
      baseURL: config.baseURL,
    });

    this.workerId = config.workerId;
    this.coordinatorId = config.coordinatorId;
    this._status = 'idle'; // idle, running, completed, error, stopped
    this._task = config.task || '';
    this._availableTools = config.tools || [];

    // 不从framework同步工具（Worker有独立工具集）
    // 但如果指定了工具列表，只注册那些工具
    if (this._availableTools.length > 0) {
      this._applyToolFilter();
    }

    // 监听完成事件
    this.on('message', (msg) => {
      // 检查是否是最终响应（无更多工具调用）
      if (msg.role === 'assistant' && !msg.toolCalls) {
        this._status = 'completed';
      }
    });
  }

  /**
   * 应用工具过滤（如果指定了tools列表）
   * @private
   */
  _applyToolFilter() {
    const allTools = Array.from(this._tools.values());
    const allowedTools = new Set(this._availableTools);

    // 移除不在允许列表中的工具
    for (const [name, tool] of this._tools) {
      if (!allowedTools.has(name)) {
        this._tools.delete(name);
      }
    }

    // 同步到chatHandler
    if (this._chatHandler) {
      this._chatHandler._tools = this._tools;
    }
  }

  /**
   * 获取Worker状态
   */
  getStatus() {
    return this._status;
  }

  /**
   * 设置状态
   */
  setStatus(status) {
    this._status = status;
  }

  /**
   * 执行初始任务
   * @param {string} task - 任务描述
   * @returns {Promise<Object>} 任务结果
   */
  async runTask(task) {
    this._task = task;
    this._status = 'running';

    try {
      const result = await this.chat(task);
      this._status = 'completed';
      return result;
    } catch (err) {
      this._status = 'error';
      throw err;
    }
  }

  /**
   * 发送消息继续Worker
   * @param {string} message - 继续消息
   * @returns {Promise<Object>} 处理结果
   */
  async sendMessage(message) {
    if (this._status === 'stopped') {
      throw new Error(`Worker ${this.workerId} has been stopped`);
    }

    this._status = 'running';
    try {
      const result = await this.chat(message);
      return result;
    } catch (err) {
      this._status = 'error';
      throw err;
    }
  }

  /**
   * 停止Worker
   */
  stop() {
    this._status = 'stopped';
    if (this._chatHandler) {
      this._chatHandler.destroy();
    }
    this.emit('stopped', { workerId: this.workerId });
  }

  /**
   * 生成<task-notification> JSON
   * @param {string} status - completed, error, stopped
   * @param {string} result - 任务结果
   * @param {string} [error] - 错误信息
   * @returns {string} JSON字符串
   */
  static formatNotification(workerId, status, result, error = null) {
    const notification = {
      worker_id: workerId,
      status: status,
      timestamp: new Date().toISOString(),
    };

    if (error) {
      notification.error = error;
    } else if (result) {
      notification.result = result;
    }

    return JSON.stringify(notification);
  }

  /**
   * 默认系统提示
   */
  static defaultPrompt() {
    return `你是一个独立的Worker Agent。
你的职责：
1. 接收并理解Coordinator分配的任务
2. 使用你的工具集完成任务
3. 返回完整的任务结果

重要规则：
- 任务完成或出错时，在响应末尾添加JSON格式的<task-notification>说明状态
- 不要主动联系Coordinator，由Coordinator主动查询结果
- 如果需要更多信息，等待Coordinator发送continue消息`;
  }
}

module.exports = { WorkerAgent };
