mirror of
https://github.com/jcwimer/wrestlingApp
synced 2026-03-25 01:14:43 +00:00
109 lines
3.6 KiB
Ruby
109 lines
3.6 KiB
Ruby
class AdvanceWrestler
|
|
def initialize(wrestler, last_match)
|
|
@wrestler = wrestler
|
|
@tournament = @wrestler.tournament
|
|
@last_match = last_match
|
|
end
|
|
|
|
def advance
|
|
# Use perform_later which will execute based on centralized adapter config
|
|
# This will be converted to inline execution in test environment by ActiveJob
|
|
AdvanceWrestlerJob.perform_later(@wrestler, @last_match, @tournament.id)
|
|
end
|
|
|
|
def advance_raw
|
|
@last_match = Match.find_by(id: @last_match&.id)
|
|
@wrestler = Wrestler.includes(:school, :weight).find_by(id: @wrestler.id)
|
|
return unless @last_match && @wrestler && @last_match.finished?
|
|
|
|
context = preload_advancement_context
|
|
matches_to_advance = []
|
|
|
|
if @tournament.tournament_type == "Pool to bracket"
|
|
matches_to_advance.concat(pool_to_bracket_advancement(context))
|
|
elsif @tournament.tournament_type.include?("Modified 16 Man Double Elimination")
|
|
service = ModifiedDoubleEliminationAdvance.new(@wrestler, @last_match, matches: context[:matches])
|
|
service.bracket_advancement
|
|
matches_to_advance.concat(service.matches_to_advance)
|
|
elsif @tournament.tournament_type.include?("Regular Double Elimination")
|
|
service = DoubleEliminationAdvance.new(@wrestler, @last_match, matches: context[:matches])
|
|
service.bracket_advancement
|
|
matches_to_advance.concat(service.matches_to_advance)
|
|
end
|
|
|
|
persist_advancement_changes(context)
|
|
advance_pending_matches(matches_to_advance)
|
|
@wrestler.school.calculate_score
|
|
end
|
|
|
|
def preload_advancement_context
|
|
weight = Weight.includes(:matches, :wrestlers).find(@wrestler.weight_id)
|
|
{
|
|
weight: weight,
|
|
matches: weight.matches.to_a,
|
|
wrestlers: weight.wrestlers.to_a
|
|
}
|
|
end
|
|
|
|
def persist_advancement_changes(context)
|
|
persist_matches(context[:matches])
|
|
persist_wrestlers(context[:wrestlers])
|
|
end
|
|
|
|
def persist_matches(matches)
|
|
timestamp = Time.current
|
|
updates = matches.filter_map do |m|
|
|
next unless m.changed?
|
|
|
|
{
|
|
id: m.id,
|
|
w1: m.w1,
|
|
w2: m.w2,
|
|
winner_id: m.winner_id,
|
|
win_type: m.win_type,
|
|
score: m.score,
|
|
finished: m.finished,
|
|
loser1_name: m.loser1_name,
|
|
loser2_name: m.loser2_name,
|
|
finished_at: m.finished_at,
|
|
updated_at: timestamp
|
|
}
|
|
end
|
|
Match.upsert_all(updates) if updates.any?
|
|
end
|
|
|
|
def persist_wrestlers(wrestlers)
|
|
timestamp = Time.current
|
|
updates = wrestlers.filter_map do |w|
|
|
next unless w.changed?
|
|
|
|
{
|
|
id: w.id,
|
|
pool_placement: w.pool_placement,
|
|
pool_placement_tiebreaker: w.pool_placement_tiebreaker,
|
|
updated_at: timestamp
|
|
}
|
|
end
|
|
Wrestler.upsert_all(updates) if updates.any?
|
|
end
|
|
|
|
def advance_pending_matches(matches_to_advance)
|
|
matches_to_advance.uniq(&:id).each do |match|
|
|
match.advance_wrestlers
|
|
end
|
|
end
|
|
|
|
def pool_to_bracket_advancement(context)
|
|
matches_to_advance = []
|
|
wrestlers_in_pool = context[:wrestlers].select { |w| w.pool == @wrestler.pool }
|
|
if @wrestler.weight.all_pool_matches_finished(@wrestler.pool) && (@wrestler.finished_bracket_matches.size < 1)
|
|
PoolOrder.new(wrestlers_in_pool).getPoolOrder
|
|
end
|
|
service = PoolAdvance.new(@wrestler, @last_match, matches: context[:matches], wrestlers: context[:wrestlers])
|
|
service.advanceWrestler
|
|
matches_to_advance.concat(service.matches_to_advance)
|
|
matches_to_advance
|
|
end
|
|
|
|
end
|