/**
 * uCharts 事件系统
 *
 * 提供事件监听、触发和删除功能
 * 从 u-charts 核心库搬迁并添加完整类型注解
 */

/**
 * 事件监听器函数类型
 */
export interface EventListener {
  (...args: any[]): void;
}

/**
 * 事件存储映射类型
 */
export interface EventMap {
  [type: string]: EventListener[];
}

/**
 * uCharts 事件类
 *
 * 提供事件监听、删除和触发功能
 */
export class uChartsEvent {
  /** 事件存储对象 */
  events: EventMap;

  constructor() {
    this.events = {};
  }

  /**
   * 添加事件监听器
   * @param type - 事件类型
   * @param listener - 事件监听器函数
   */
  addEventListener(type: string, listener: EventListener): void {
    this.events[type] = this.events[type] || [];
    this.events[type].push(listener);
  }

  /**
   * 删除事件类型的所有监听器
   * @param type - 事件类型
   */
  delEventListener(type: string): void {
    this.events[type] = [];
  }

  /**
   * 触发事件，调用该类型的所有监听器
   * @param params - 事件类型和其他参数
   */
  trigger(...params: any[]): void {
    const type = params[0];
    const eventParams = params.slice(1);
    if (!!this.events[type]) {
      this.events[type].forEach(function(listener) {
        try {
          listener.apply(null, eventParams);
        } catch (e) {
          // console.log('[uCharts] ' + e);
        }
      });
    }
  }
}

export default uChartsEvent;
