/**
 * EventEmitter 事件发射器
 * 简单的事件总线实现
 */

class EventEmitter {
  constructor() {
    this._events = new Map();
  }

  /**
   * 监听事件
   * @param {string} event - 事件名
   * @param {Function} handler - 处理函数
   * @returns {this}
   */
  on(event, handler) {
    if (!this._events.has(event)) {
      this._events.set(event, new Set());
    }
    this._events.get(event).add(handler);
    return this;
  }

  /**
   * 监听一次性事件
   * @param {string} event - 事件名
   * @param {Function} handler - 处理函数
   * @returns {this}
   */
  once(event, handler) {
    const wrapper = (...args) => {
      handler(...args);
      this.off(event, wrapper);
    };
    return this.on(event, wrapper);
  }

  /**
   * 取消监听
   * @param {string} event - 事件名
   * @param {Function} handler - 处理函数
   * @returns {this}
   */
  off(event, handler) {
    const handlers = this._events.get(event);
    if (handlers) {
      handlers.delete(handler);
    }
    return this;
  }

  /**
   * 触发事件
   * @param {string} event - 事件名
   * @param {...any} args - 参数
   * @returns {this}
   */
  emit(event, ...args) {
    const handlers = this._events.get(event);
    if (handlers) {
      for (const handler of handlers) {
        try {
          handler(...args);
        } catch (err) {
          // EventEmitter error: Error in handler for '${event}':`, err)
        }
      }
    }
    return this;
  }

  /**
   * 移除所有监听器
   * @param {string} [event] - 可选，指定事件名
   * @returns {this}
   */
  removeAllListeners(event) {
    if (event) {
      this._events.delete(event);
    } else {
      this._events.clear();
    }
    return this;
  }

  /**
   * 获取监听器数量
   * @param {string} event - 事件名
   * @returns {number}
   */
  listenerCount(event) {
    return this._events.get(event)?.size || 0;
  }
}

module.exports = { EventEmitter };
