// MessageDispatcher.ts

/**​ 消息处理器类型 */
export type MessageHandler = (data: any) => void

export class MessageDispatcher {
  private static _instance: MessageDispatcher
  private _handlers: Map<number, MessageHandler[]> = new Map()

  /**​ 单例模式 */
  public static get Instance(): MessageDispatcher {
    if (!this._instance) {
      this._instance = new MessageDispatcher()
    }
    return this._instance
  }

  /**
   * 注册消息处理器（允许多个 Handler）
   * @param msgId 消息ID
   * @param handler 回调函数
   */
  public On(msgId: number, handler: MessageHandler): void {
    if (!this._handlers.has(msgId)) {
      this._handlers.set(msgId, [])
    }
    this._handlers.get(msgId)?.push(handler) // 添加到队列
  }

  /**
   * 移除指定的消息处理器（通过函数引用精准匹配）
   * @param msgId 消息ID
   * @param handler 要移除的回调函数
   */
  public Off(msgId: number, handler: MessageHandler): void {
    const handlers = this._handlers.get(msgId)
    if (!handlers) return

    // 过滤掉指定的 handler
    const newHandlers = handlers.filter((h) => h !== handler)
    this._handlers.set(msgId, newHandlers)
  }

  /**
   * 消息派发器中handler数量
   * @param msgId 消息ID
   * @returns 返回消息派发器中handler数量
   */
  public Size(msgId: number): number {
    if (msgId === 0) {
      return this._handlers.size
    }
    const handlers = this._handlers.get(msgId)
    if (handlers) {
      return handlers.length
    }
    return 0
  }

  /**
   * 派发消息（按注册顺序执行所有 Handler）
   * @param msgId 消息ID
   * @param msg 消息数据
   */
  public Dispatch(msgId: number, msg: any): void {
    const handlers = this._handlers.get(msgId)
    if (handlers) {
      handlers.forEach((handler) => handler(msg)) // 顺序执行
    }
  }
}
