require 'test_helper'

class PoolbracketMatchupsTest < ActionDispatch::IntegrationTest
  def setup
    @tournament = Tournament.find(1)
    @tournament.upcomingMatches
    @genMatchups = @tournament.generateMatchups
  end
  
  def createTournament(numberOfWrestlers)
    @count = 1
    @id = 6000 + numberOfWrestlers
    @tournament3 = Tournament.new
    @tournament3.id = @id
    @tournament3.name = "Something"
    @tournament3.address = "Some Place"
    @tournament3.director = "Some Guy"
    @tournament3.director_email = "test@test.com"
    @tournament3.save
    @school3 = School.new
    @school3.id = @id
    @school3.name = "Shit Show"
    @school3.tournament_id = @id
    @school3.save
    @weight3 = Weight.new
    @weight3.id = @id
    @weight3.max = 350
    @weight3.tournament_id = @id
    @weight3.save
    until @count > numberOfWrestlers do
      @wrestler2 = Wrestler.new
      @wrestler2.name = "Guy #{@count}"
      @wrestler2.school_id = @id
      @wrestler2.weight_id = @id
      @wrestler2.original_seed = @count
      @wrestler2.season_loss = 0
      @wrestler2.season_win = 0
      @wrestler2.criteria = nil
      @wrestler2.save
      @count = @count + 1
    end
    return @tournament3
  end
  
  def checkForByeInPool(tournament)
    @matchups = tournament.generateMatchups
    tournament.weights.each do |w|
      w.wrestlers.each do |wr|
        @round = 1
        if w.totalRounds(@matchups) > 5
          until @round > w.poolRounds(@matchups) do
            if wr.boutByRound(@round,@matchups) == "BYE"
              @message = "BYE"
            end
            @round = @round + 1
          end
          assert_equal "BYE", @message
          @message = nil
        end
      end
    end
  end
    

  test "the truth" do
    assert true
  end
  
  test "found tournament" do
    refute_nil @tournament
  end
  
  test "tests boutNumber matches round" do
    @matchup_to_test = @genMatchups.select{|m| m.boutNumber == 4000}.first
    assert_equal 4, @matchup_to_test.round
  end
  
  test "tests boutNumbers are generated with smallest weight first regardless of id" do
    @weight = @tournament.weights.map.sort_by{|x|[x.max]}.first
    @matchup = @genMatchups.select{|m| m.boutNumber == 1000}.first
    assert_equal @weight.max, @matchup.weight_max
  end
  
  test "tests number of matches in 5 man one pool" do
    @six_matches = @genMatchups.select{|m| m.weight_max == 106}
    assert_equal 10, @six_matches.length
  end
  
  test "tests number of matches in 11 man pool bracket" do
    @twentysix_matches = @genMatchups.select{|m| m.weight_max == 126}
    assert_equal 22, @twentysix_matches.length
  end
  
  test "tests number of matches in 9 man pool bracket" do
    @twentysix_matches = @genMatchups.select{|m| m.weight_max == 113}
    assert_equal 18, @twentysix_matches.length
  end
  
  test "tests number of matches in 7 man pool bracket" do
    @twentysix_matches = @genMatchups.select{|m| m.weight_max == 120}
    assert_equal 13, @twentysix_matches.length
  end
  
  test "tests number of matches in 16 man pool bracket" do
    @twentysix_matches = @genMatchups.select{|m| m.weight_max == 132}
    assert_equal 32, @twentysix_matches.length
  end
  
  test "tests serialization for matchups" do
    @tournament_saved = Tournament.find(1)
    @genMatchup = @genMatchups.select{|m| m.boutNumber == 4000}.first
    @matchup = @tournament_saved.upcomingMatches.select{|m| m.boutNumber == 4000}.first
    assert_equal @genMatchup.w1_name, @matchup.w1_name
  end
  
  test "test if a wrestler can exceed five matches" do
    @count = 5
    until @count > 16 do
      @tournament2 = createTournament(@count)
      checkForByeInPool(@tournament2)
      @count = @count + 1
    end
  end
  
  #todo test crazy movements through each bracket?
end
