export function mergeUserPreservingForecastBalance(prevUser: any, nextUser: any) {
  if (!nextUser) return prevUser;
  if (prevUser?._forecast_balance === undefined) return nextUser;
  return {
    ...nextUser,
    _forecast_balance: prevUser._forecast_balance,
  };
}

export function applyForecastBalanceResponse(prevUser: any, forecastBalance: number | undefined) {
  if (!prevUser || forecastBalance === undefined) return prevUser;
  return {
    ...prevUser,
    _forecast_balance: forecastBalance,
  };
}

export function applyForecastCreditDelta(
  prevUser: any,
  credits: number,
  balanceKey: 'daily_free_forecasts' | 'survey_bonus_forecasts' = 'daily_free_forecasts',
) {
  if (!prevUser || !credits) return prevUser;

  return {
    ...prevUser,
    [balanceKey]: (prevUser[balanceKey] || 0) + credits,
    ...(prevUser._forecast_balance !== undefined
      ? { _forecast_balance: prevUser._forecast_balance + credits }
      : {}),
  };
}

export function applySurveyRewardResponse(prevUser: any, result: any) {
  if (!prevUser || !result) return prevUser;

  const creditsAwarded = Number(result.creditsAwarded || 0);
  const forecastBalanceRaw = result.forecastBalance ?? result.forecast_balance ?? result.newBalance;
  const forecastBalance = typeof forecastBalanceRaw === 'number'
    ? forecastBalanceRaw
    : Number.isFinite(Number(forecastBalanceRaw))
      ? Number(forecastBalanceRaw)
      : undefined;

  const nextUser = creditsAwarded
    ? applyForecastCreditDelta(prevUser, creditsAwarded, 'survey_bonus_forecasts')
    : prevUser;

  return forecastBalance !== undefined
    ? applyForecastBalanceResponse(nextUser, forecastBalance)
    : nextUser;
}
