/**
 * 穩定 ID 衍生工具
 *
 * 邏輯零件：  cmp_<sha256(canonical_id)[:8]>
 * API recipe：rec_<sha256(canonical_id)[:8]>
 *
 * 同一個 canonical_id 永遠得到同一個 hash，
 * 讓 workflow 可以用 hash 引用零件，不受改名影響。
 */

export async function deriveComponentHash(canonicalId: string): Promise<string> {
  return 'cmp_' + await sha256Prefix(canonicalId);
}

export async function deriveRecipeHash(canonicalId: string): Promise<string> {
  return 'rec_' + await sha256Prefix(canonicalId);
}

export function isComponentHash(id: string): boolean {
  return /^cmp_[0-9a-f]{8}$/.test(id);
}

export function isRecipeHash(id: string): boolean {
  return /^rec_[0-9a-f]{8}$/.test(id);
}

/** 匯出給 credential-store-migration T5 用（secret_ref 命名衍生租戶隔離 hash，非解密/簽章邏輯）。 */
export { sha256Prefix };

async function sha256Prefix(input: string): Promise<string> {
  const data = new TextEncoder().encode(input);
  const buf = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(buf))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('')
    .slice(0, 8);
}
