/**
 * UUID 生成器类
 * 提供静态方法生成符合 RFC4122 标准的 UUID
 */
export class UUIDGenerator {
    // 私有静态计数器
    private static counter = 0;
    
    /**
     * 获取递增计数器值
     */
    private static getCounter(): number {
      this.counter = (this.counter + 1) % 0xffffff;
      return this.counter;
    }
  
    /**
     * 生成 UUID v4 (随机)
     * @returns 返回符合 RFC4122 标准的 UUID 字符串
     * @example
     * UUIDGenerator.generate() // => "123e4567-e89b-12d3-a456-426614174000"
     */
    public static generate(): string {
      if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
        const buffer = new Uint8Array(16);
        crypto.getRandomValues(buffer);
  
        buffer[6] = (buffer[6] & 0x0f) | 0x40;
        buffer[8] = (buffer[8] & 0x3f) | 0x80;
  
        return ([
          buffer.slice(0, 4).reduce((acc, val) => acc + ('00' + val.toString(16)).slice(-2), ''),
          buffer.slice(4, 6).reduce((acc, val) => acc + ('00' + val.toString(16)).slice(-2), ''),
          buffer.slice(6, 8).reduce((acc, val) => acc + ('00' + val.toString(16)).slice(-2), ''),
          buffer.slice(8, 10).reduce((acc, val) => acc + ('00' + val.toString(16)).slice(-2), ''),
          buffer.slice(10, 16).reduce((acc, val) => acc + ('00' + val.toString(16)).slice(-2), ''),
        ]).join('-');
      }
  
      // 改进的后备方案
      const timestamp = Date.now();
      const count = this.getCounter();
      const random = Math.random() * 0xffffffff | 0;
      
      const time_low = timestamp & 0xffffffff;
      const time_mid = ((timestamp >>> 32) & 0xffff) ^ (count & 0xffff);
      const time_hi = 0x4000 | (random & 0x0fff);
      const clock_seq = 0x8000 | (random >>> 16 & 0x3fff);
      const node = random >>> 32;
  
      return (
        time_low.toString(16).padStart(8, '0') + '-' +
        time_mid.toString(16).padStart(4, '0') + '-' +
        time_hi.toString(16).padStart(4, '0') + '-' +
        clock_seq.toString(16).padStart(4, '0') + '-' +
        node.toString(16).padStart(12, '0')
      );
    }
  }