package Ġcom . f eli pec sl . elif ut . services Ċ Ċ import Ġandroid . support . annotation . Visible ForTesting Ċ import Ġandroid . util . Log Ċ import Ġcom . f eli pec sl . elif ut . models . Club Ċ import Ġcom . f eli pec sl . elif ut . models . League Round Ċ import Ġcom . f eli pec sl . elif ut . models . Match Ċ import Ġcom . f eli pec sl . elif ut . util . shuffle Ċ import Ġcom . google . common . base . Preconditions Ċ import Ġjava . util .* Ċ Ċ open Ġclass ĠLeague Round Generator Ġ{ ĊĠ Ġ@ Visible ForTesting Ġfun Ġgenerate Round s Determin istic ( club s : ĠList < Club >): ĠList < League Round > Ġ{ ĊĠĠĠ ĠPreconditions . checkNotNull ( club s ) ĊĠĠĠ ĠPreconditions . check Argument ( club s . size Ġ> Ġ 1 , Ġ" Need Ġat Ġleast Ġ 2 Ġclub s ") ĊĊĠĠĠ Ġval Ġclub s Copy Ġ= ĠArrayList ( club s ) ĊĊĠĠĠ Ġif Ġ( club s Copy . size Ġ% Ġ 2 Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġclub s Copy . remove At ( club s Copy . size Ġ- Ġ 1 ) ĊĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Got Ġodd Ġnumber Ġof Ġclub s , Ġdropping Ġthe Ġlast Ġone ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtotal Club s Ġ= Ġclub s Copy . size ĊĠĠĠ Ġval Ġtotal Round s Ġ= Ġ( total Club s Ġ- Ġ 1 ) Ġ* Ġ 2 ĊĠĠĠ Ġval Ġmatches Per Round Ġ= Ġtotal Club s Ġ/ Ġ 2 ĊĠĠĠ Ġval Ġrounds Ġ= ĠarrayOf Null s < League Round >( total Round s ) ĊĊĠĠĠ Ġfor Ġ( k Ġin Ġrounds . indices ) Ġ{ ĊĠĠĠĠĠ Ġrounds [ k ] Ġ= ĠLeague Round . create ( k Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġclub Map Ġ= ĠHashMap < Int , ĠClub >() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. total Club s ) Ġ{ ĊĠĠĠĠĠ Ġclub Map . put ( i , Ġclub s Copy [ i Ġ- Ġ 1 ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( round Ġin Ġ 0 .. total Round s Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( match Ġin Ġ 0 .. matches Per Round Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhome Ġ= Ġ( round Ġ+ Ġmatch ) Ġ% Ġ( total Club s Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvar Ġaway Ġ= Ġ( total Club s Ġ- Ġ 1 Ġ- Ġmatch Ġ+ Ġround ) Ġ% Ġ( total Club s Ġ- Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLast Ġteam Ġstays Ġin Ġthe Ġsame Ġplace Ġwhile Ġthe Ġothers ĊĠĠĠĠĠĠĠ Ġ// Ġrotate Ġaround Ġit . ĊĠĠĠĠĠĠĠ Ġif Ġ( match Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġaway Ġ= Ġtotal Club s Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclub Home : ĠClub ĊĠĠĠĠĠĠĠ Ġval Ġclub Away : ĠClub ĊĠĠĠĠĠĠĠ Ġif Ġ( round Ġ% Ġ 2 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġclub Home Ġ= Ġclub Map [ home Ġ+ Ġ 1 ] !! ĊĠĠĠĠĠĠĠĠĠ Ġclub Away Ġ= Ġclub Map [ away Ġ+ Ġ 1 ] !! ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġclub Home Ġ= Ġclub Map [ away Ġ+ Ġ 1 ] !! ĊĠĠĠĠĠĠĠĠĠ Ġclub Away Ġ= Ġclub Map [ home Ġ+ Ġ 1 ] !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Match Ġ= ĠMatch . create ( club Home , Ġclub Away ) ĊĠĠĠĠĠĠĠ Ġrounds [ round ] !!. add Match ( new Match ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠArrays . asList < League Round >(* rounds ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠGenerates Ġa Ġrandom Ġlist Ġof Ġle ague Ġrounds Ġfrom Ġthe Ġprovided Ġlist Ġof Ġclub s . Ġ Ġ*/ ĊĠ Ġopen Ġfun Ġgenerate Round s ( club s : ĠList < Club >): ĠList < League Round > Ġ{ ĊĠĠĠ Ġ// ĠMake Ġa Ġdef ensive Ġcopy Ġsince Ġwe Ġneed Ġto Ġmutate Ġit ĊĠĠĠ Ġreturn Ġgenerate Round s Determin istic ( ArrayList ( club s ). shuffle ()) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" com . f eli pec sl . elif ut . services . League Round Generator " ĊĠ Ġ} Ċ } Ċ