import { randomBytes } from 'crypto';
import { v4 as uuid } from 'uuid';

//* 랜덤 Uuid 생성(구독번호 / 주문번호 생성시 사용)
export function newUuid(length?: number) {
  const id = uuid().slice(0, 6) + +new Date();
  return id.slice(0, length);
}

//* ULID Crockford base32 알파벳 (외부 의존성 없이 자체 구현)
const ULID_ENCODING = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
const ULID_TIME_LEN = 10;
const ULID_RANDOM_LEN = 16;

function encodeUlidTime(now: number): string {
  let chars = '';
  let time = now;
  for (let i = ULID_TIME_LEN - 1; i >= 0; i--) {
    const mod = time % 32;
    chars = ULID_ENCODING.charAt(mod) + chars;
    time = (time - mod) / 32;
  }
  return chars;
}

function encodeUlidRandom(): string {
  const bytes = randomBytes(ULID_RANDOM_LEN);
  let chars = '';
  for (let i = 0; i < ULID_RANDOM_LEN; i++) {
    chars += ULID_ENCODING.charAt(bytes[i] % 32);
  }
  return chars;
}

/**
 * ULID(26자, Crockford base32) 생성기.
 * - 사전 정렬 가능한 시간기반 prefix(10자) + 랜덤(16자).
 * - 외부 패키지 도입 없이 Node 표준 crypto만 사용.
 */
export function newUlid(): string {
  return encodeUlidTime(Date.now()) + encodeUlidRandom();
}
