import { AllocationPercentages, RangePlayer, SpotPlayer } from './types';

/**
 * Default allocation percentages used if none are provided.
 */
export const DEFAULT_RANGE_ALLOCATION_PERCENTAGES: AllocationPercentages = {
  metafide_rake: 0.019875, // 1.9875%
  streak_pot_5: 0.01425, // 1.425%
  streak_pot_10: 0.0095, // 0.95%
  streak_pot_25: 0.002375, // 0.2375%
  daily_reward_pot: 0.0035, // 0.35%
  monthly_reward_pot: 0.0015, // 0.15%
  burn: 0.025, // 2.5%
};

export const DEFAULT_SPOT_ALLOCATION_PERCENTAGES: AllocationPercentages = {
  metafide_rake: 0.019875, // 1.9875%
  range_rake: 0.015, // 1.5%
  streak_pot_5: 0.01425, // 1.425%
  streak_pot_10: 0.0095, // 0.95%
  streak_pot_25: 0.002375, // 0.2375%
  burn: 0.025, // 2.5%
  daily_reward_pot: 0.0035, // 0.35%
  monthly_reward_pot: 0.0015, // 0.15%
};

/**
 * Scales down a number from 1e8, safely handling all edge cases.
 * @param value - The input value to scale
 * @returns The scaled value, or 0 if input is invalid
 */
export function scaleFrom1e8(value: number | undefined | null): number {
  if (typeof value !== 'number' || !isFinite(value)) {
    return 0;
  }

  if (value === 0) {
    return 0;
  }

  return value / 1e8;
}

export function serializeRangePlayer(data: RangePlayer): RangePlayer {
  return {
    gid: Number(data.gid),
    c: data.c,
    a: data.a,
    id: data.id,
    f: Number(data.f),
    hp: Number(data.hp),
    lp: Number(data.lp),
    cm: data.cm,
    cmt: data.cmt ?? null,
    t: data.t,
    w: Number(data.w),
    r: Number(data.r),
    p: Number(data.p),
    ex: data.ex,
    ex_ha: data.ex_ha ? Number(data.ex_ha) : null,
    ex_la: data.ex_la ? Number(data.ex_la) : null,
    ex_t: data.ex_t ? Number(data.ex_t) : null,
    pw: data.pw,
    win: data.win,
  };
}

export function serializeSpotPlayer(data: SpotPlayer): SpotPlayer {
  return {
    gid: Number(data.gid),
    c: data.c,
    a: data.a,
    id: data.id,
    f: Number(data.f),
    cm: data.cm,
    cmt: data.cmt ?? null,
    t: data.t,
    w: Number(data.w),
    r: Number(data.r),
    sp: Number(data.sp),
    pw: data.pw,
    win: data.win,
    tx: data.tx,
    txid: data.txid,
  };
}
