// MessageDecoder.ts
import * as pb from './pbExport'

export class MessageDecoder {
  // 消息ID与消息类的映射表
  private static _messageClasses: Map<number, (buffer: Uint8Array) => any> = new Map()

  /**
   * 注册消息类（启动时调用）
   * @param msgId 消息ID
   * @param decoder 解码函数（如 pb.ReqUserLogin.decode）
   */
  public static Register<T>(msgId: number, decoder: (buffer: Uint8Array) => T): void {
    this._messageClasses.set(msgId, decoder)
  }

  /**
   * 解码消息（根据ID动态实例化对应消息类）
   * @param msgId 消息ID
   * @param buffer 原始消息（Uint8Array）
   * @returns 解码后的消息对象
   */
  public static Decode(msgId: number, buffer: Uint8Array): [any, Error] {
    try {
      const decoder = this._messageClasses.get(msgId)
      if (!decoder) {
        return [null, new Error(`未注册的消息ID: ${msgId}`)]
      }
      // 实例化消息类并解码数据
      const instance = decoder(buffer)
      return [instance, null]
    } catch (err) {
      return [null, new Error(`解消息: ${msgId} 失败。err:${err}`)]
    }
  }

  /**
   * 字节流转换成Hex码
   * @param buffer 原始消息（Uint8Array）
   * @returns 字节流转换成Hex码
   */
  public static Uint8ToHex(buffer: Uint8Array): string {
    return Array.from(buffer)
      .map((byte) => byte.toString(16).padStart(2, '0'))
      .join(' ')
  }
}

MessageDecoder.Register(pb.MsgId.ReqUserLoginId, pb.ReqUserLogin.decode)
MessageDecoder.Register(pb.MsgId.RspUserLoginId, pb.RspUserLogin.decode)
