class ActiveGenie::Ranking::PlayersCollection

def build(param_players)

def build(param_players)
  param_players.map { |p| Player.new(p) }
end

def calc_defender_tier

def calc_defender_tier
  eligible[(tier_size*-2)...(tier_size*-1)]
end

def calc_relegation_tier

def calc_relegation_tier
  eligible[(tier_size*-1)..-1]
end

def coefficient_of_variation

def coefficient_of_variation
  score_list = eligible.map(&:score).compact
  return nil if score_list.empty?
  mean = score_list.sum.to_f / score_list.size
  return nil if mean == 0
  variance = score_list.map { |num| (num - mean) ** 2 }.sum / score_list.size
  standard_deviation = Math.sqrt(variance)
  (standard_deviation / mean) * 100
end

def eligible

def eligible
  sorted.reject(&:eliminated)
end

def eligible_size

def eligible_size
  @players.reject(&:eliminated).size
end

def elo_eligible?

def elo_eligible?
  eligible.size > 15
end

def initialize(param_players)

def initialize(param_players)
  @players = build(param_players)
end

def method_missing(...)

def method_missing(...)
  @players.send(...)
end

def sorted

def sorted
  sorted_players = @players.sort_by { |p| [-p.ffa_score, -(p.elo || 0), -(p.score || 0)] }
  sorted_players.each_with_index { |p, i| p.rank = i + 1 }
  sorted_players
end

def tier_size

4 rounds to reach top 10 with 50 players
- 14 eligible, tier_size: 4
- 24 eligible, tier_size: 10
- 35 eligible, tier_size: 11
- 50 eligible, tier_size: 15
Example:
based on the eligible size, start fast and go slow until top 10
Returns the number of players to battle in each round
def tier_size
  [[(eligible_size / 3).ceil, 10].max, eligible_size - 10].min
end

def to_h

def to_h
  sorted.map { |p| p.to_h }
end