export interface BaseGameData {
  gid: number;
  t1: number;
  t2: number;
  t3: number;
  st: string;
  ha: number | null;
  la: number | null;
  oa: number | null;
  ca: number | null;
}

export type RangeGame = BaseGameData;

export interface SpotGame extends BaseGameData {
  ai: number | null;
}

export interface BasePlayerData {
  gid: number;
  c: string;
  a: string;
  f: number;
  cm: boolean;
  t: string | number;
  w: number;
  r: number;
  pw: string;
  win: boolean;
  tx?: string;
}

export interface RangePlayer extends BasePlayerData {
  id: string;
  hp: number;
  lp: number;
  cmt: string | null;
  p: number;
  ex: boolean;
  ex_ha: number | null;
  ex_la: number | null;
  ex_t: number | null;
}

export interface SpotPlayer extends BasePlayerData {
  id: number;
  sp: number;
  cmt: number | null;
  txid?: string;
}

export type SpotVarianceInput = {
  actual_price: number;
  abs_spot_var: number;
  token_milliseconds: number;
  share_tkm_to_var: number;
  sum_share_tkm_to_var: number;
};

export type RangeVarianceInput = {
  high_actual: number;
  low_actual: number;
  total_variance: number;
  sum_total_variance: number;
};

export type SpotPlayerVarianceResult = SpotPlayer & {
  varianceInput: SpotVarianceInput;
};

export type RangePlayerVarianceResult = RangePlayer & {
  varianceInput: RangeVarianceInput;
};

export interface PotDistribution {
  total_pot: number;
  metafide_rake: number;
  streak_pot_5: number;
  streak_pot_10: number;
  streak_pot_25: number;
  daily_reward_pot: number;
  monthly_reward_pot: number;
  burn: number;
  winning_pot: number;
  range_rake?: number;
}

export interface AllocationPercentages {
  metafide_rake: number;
  streak_pot_5: number;
  streak_pot_10: number;
  streak_pot_25: number;
  daily_reward_pot: number;
  monthly_reward_pot: number;
  burn: number;
  range_rake?: number;
}

export interface ComputedData {
  players: (RangePlayer | SpotPlayer)[]; // List of players with computed winnings and returns
  streak: {
    winnings: (RangePlayer | SpotPlayer)[]; // Top players by total winnings
    returns: (RangePlayer | SpotPlayer)[]; // Top players by percent return
  };
}
