import { createHash } from 'node:crypto';

/**
 * 输入指纹 — sha256(callKey + promptVersion + canonicalJSON(input))
 *
 * Canonical JSON:key 字典序排序,避免对象字段顺序差异导致 hash 不一致。
 * 缓存命中 / golden set 匹配 / 调试重跑 都依赖这个 hash 稳定。
 */
export function computeInputHash(
  callKey: string,
  promptVersion: string,
  input: unknown,
): string {
  const payload = `${callKey}|${promptVersion}|${stableStringify(input)}`;
  return createHash('sha256').update(payload).digest('hex');
}

function stableStringify(value: unknown): string {
  if (value === null || typeof value !== 'object') return JSON.stringify(value);
  if (Array.isArray(value)) return `[${value.map(stableStringify).join(',')}]`;
  const obj = value as Record<string, unknown>;
  const keys = Object.keys(obj).sort();
  return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(',')}}`;
}
