/// Money utilities — 全栈唯一的金额单位转换工具。
///
/// PAC 的金额一律以最小货币单位(分,Int)在 DB / Service / API 之间流转,
/// 只在两个边界做转换:
///   1) 入口:宿主单位 → 分(由 adapter / FieldMapper 完成,见 yuanToFen)
///   2) 出口:分 → 元字符串(仅前端展示用,见 fenToYuan / formatMoney)
///
/// 不要在中间层调用这些工具,会破坏单一真理源约定。

/// 元(decimal)→ 分(int)。Ingest 层用,统一四舍五入。
/// 接受 number | string,支持宿主以字符串("100.50")提供。
/// 非有限数字 / NaN 抛错,避免静默写入异常金额。
export function yuanToFen(yuan: number | string): number {
  const n = typeof yuan === 'string' ? Number.parseFloat(yuan) : yuan;
  if (!Number.isFinite(n)) {
    throw new Error(`yuanToFen: invalid input ${JSON.stringify(yuan)}`);
  }
  return Math.round(n * 100);
}

/// 分(int)→ 元(string,固定 2 位小数)。展示层用。
/// 输入应为整数,非整数会被 toFixed 隐式四舍五入(算作上游 bug 的兜底,不应发生)。
export function fenToYuan(cents: number): string {
  return (cents / 100).toFixed(2);
}

/// 分 → 带币种符号的展示字符串。
/// 仅 CNY 输出 "￥100.50";其他币种输出 "USD 100.50" 这种保守形式,避免符号歧义。
export function formatMoney(cents: number, currency = 'CNY'): string {
  const amount = fenToYuan(cents);
  if (currency === 'CNY') return `￥${amount}`;
  return `${currency} ${amount}`;
}
