/**
 * BigInt工具类 - 用于处理大整数的JSON序列化和反序列化
 * 解决JavaScript Number类型精度限制问题（最大安全整数为2^53-1）
 */
export default class BigIntUtils {
  
  /**
   * 将大整数转换为字符串，避免JSON序列化时精度丢失
   * @param value 大整数值
   * @returns 字符串形式的大整数
   */
  static toString(value: number | string): string {
    if (typeof value === 'string') {
      return value;
    }
    return value.toString();
  }

  /**
   * 将字符串转换为数字（如果安全的话）
   * @param value 字符串形式的大整数
   * @returns 数字或字符串
   */
  static toNumber(value: string): number | string {
    const num = Number(value);
    // 检查是否超出安全整数范围
    if (Number.isSafeInteger(num)) {
      return num;
    }
    return value; // 返回字符串以保持精度
  }

  /**
   * 检查是否为安全整数
   * @param value 要检查的值
   * @returns 是否为安全整数
   */
  static isSafeInteger(value: number): boolean {
    return Number.isSafeInteger(value);
  }

  /**
   * 获取最大安全整数
   * @returns 最大安全整数
   */
  static getMaxSafeInteger(): number {
    return Number.MAX_SAFE_INTEGER; // 2^53 - 1
  }

  /**
   * 格式化大整数显示
   * @param value 大整数值（字符串或数字）
   * @returns 格式化后的字符串
   */
  static format(value: number | string): string {
    const str = this.toString(value);
    return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  }

  /**
   * 比较两个大整数
   * @param a 第一个值
   * @param b 第二个值
   * @returns 比较结果 (-1: a<b, 0: a=b, 1: a>b)
   */
  static compare(a: number | string, b: number | string): number {
    const strA = this.toString(a);
    const strB = this.toString(b);
    
    if (strA.length !== strB.length) {
      return strA.length > strB.length ? 1 : -1;
    }
    
    return strA.localeCompare(strB);
  }
} 