/**
 * UUID v4 生成 utility
 *
 * `crypto.randomUUID()` は Safari 15.4+ / Chrome 92+ / Firefox 95+ のみ対応。
 * iOS 15.3 以前 / Android Chrome 91 以前で TypeError を起こさないようフォールバックを提供する。
 *
 * 使用順:
 *   1. crypto.randomUUID() (最速・最安全)
 *   2. crypto.getRandomValues() ベースの RFC4122 v4 (Safari 11+ / Chrome 11+ で対応)
 *   3. Math.random() ベース (最終fallback、エントロピーは弱いがcrash回避優先)
 *
 * 関連 Issue: #443
 */

/**
 * UUID v4 (RFC4122) を生成して返す。
 * @returns {string} 例: "f47ac10b-58cc-4372-a567-0e02b2c3d479"
 */
export function uuidv4() {
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
    return crypto.randomUUID();
  }

  if (typeof crypto !== "undefined" && typeof crypto.getRandomValues === "function") {
    const bytes = new Uint8Array(16);
    crypto.getRandomValues(bytes);
    // RFC4122 v4: version (4) と variant (10xx) を埋め込む
    bytes[6] = (bytes[6] & 0x0f) | 0x40;
    bytes[8] = (bytes[8] & 0x3f) | 0x80;
    const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0"));
    return (
      hex.slice(0, 4).join("") +
      "-" +
      hex.slice(4, 6).join("") +
      "-" +
      hex.slice(6, 8).join("") +
      "-" +
      hex.slice(8, 10).join("") +
      "-" +
      hex.slice(10, 16).join("")
    );
  }

  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
    const r = (Math.random() * 16) | 0;
    const v = c === "x" ? r : (r & 0x3) | 0x8;
    return v.toString(16);
  });
}

/**
 * UUID から先頭8文字 (短い識別子) を返す。
 * 既存コードで `crypto.randomUUID().split('-')[0]` パターンを置き換える用途。
 * @returns {string} 例: "f47ac10b"
 */
export function shortId() {
  return uuidv4().split("-")[0];
}
