// Hint-count derivation, kept out of the .svelte component so it is unit-testable.
//
// The badge shows the per-game hint allowance remaining plus the player's global hint
// wallet. The server's hints_remaining folds the two together, but the wallet is global —
// shared across every game — so caching the combined number per game makes it go stale the
// moment a wallet hint is spent in another game. We therefore split it: the per-game
// allowance is hints_remaining - wallet_balance (both from the same fetch, so it is stable
// and cacheable), and the wallet is read live from the global profile, never the per-game
// snapshot.

import type { StateView } from './model';

/**
 * hintsLeft is the hint count for the badge: the per-game allowance remaining (the view's
 * hints_remaining minus the wallet snapshot baked into that same view) plus the live global
 * wallet balance. Passing the live wallet (not view.walletBalance) is what keeps the count
 * correct when a wallet hint was spent in another game since this view was fetched.
 */
export function hintsLeft(
  view: Pick<StateView, 'hintsRemaining' | 'walletBalance'> | null,
  walletBalance: number,
): number {
  if (!view) return 0;
  const allowance = Math.max(0, view.hintsRemaining - view.walletBalance);
  return allowance + Math.max(0, walletBalance);
}
