2222 */
2323
2424import com .softwaremagico .kt .core .controller .models .ClubDTO ;
25+ import com .softwaremagico .kt .core .controller .models .GroupLinkDTO ;
2526import com .softwaremagico .kt .core .controller .models .ParticipantDTO ;
2627import com .softwaremagico .kt .core .controller .models .TeamDTO ;
2728import com .softwaremagico .kt .core .converters .ClubConverter ;
29+ import com .softwaremagico .kt .core .converters .GroupLinkConverter ;
2830import com .softwaremagico .kt .core .converters .ParticipantConverter ;
2931import com .softwaremagico .kt .core .converters .TeamConverter ;
3032import com .softwaremagico .kt .core .converters .models .ClubConverterRequest ;
33+ import com .softwaremagico .kt .core .converters .models .GroupLinkConverterRequest ;
3134import com .softwaremagico .kt .core .converters .models .ParticipantConverterRequest ;
3235import com .softwaremagico .kt .core .converters .models .TeamConverterRequest ;
3336import com .softwaremagico .kt .core .csv .ClubCsv ;
37+ import com .softwaremagico .kt .core .csv .GroupLinkCsv ;
3438import com .softwaremagico .kt .core .csv .ParticipantCsv ;
3539import com .softwaremagico .kt .core .csv .TeamCsv ;
3640import com .softwaremagico .kt .core .exceptions .InvalidCsvFieldException ;
41+ import com .softwaremagico .kt .core .exceptions .TournamentNotFoundException ;
3742import com .softwaremagico .kt .core .providers .ClubProvider ;
43+ import com .softwaremagico .kt .core .providers .GroupLinkProvider ;
44+ import com .softwaremagico .kt .core .providers .GroupProvider ;
3845import com .softwaremagico .kt .core .providers .ParticipantProvider ;
3946import com .softwaremagico .kt .core .providers .RoleProvider ;
4047import com .softwaremagico .kt .core .providers .TeamProvider ;
48+ import com .softwaremagico .kt .core .providers .TournamentProvider ;
49+ import com .softwaremagico .kt .logger .ExceptionType ;
4150import com .softwaremagico .kt .logger .KendoTournamentLogger ;
4251import com .softwaremagico .kt .persistence .entities .Club ;
52+ import com .softwaremagico .kt .persistence .entities .Group ;
53+ import com .softwaremagico .kt .persistence .entities .GroupLink ;
4354import com .softwaremagico .kt .persistence .entities .Participant ;
4455import com .softwaremagico .kt .persistence .entities .Role ;
4556import com .softwaremagico .kt .persistence .entities .Team ;
57+ import com .softwaremagico .kt .persistence .entities .Tournament ;
4658import com .softwaremagico .kt .persistence .values .RoleType ;
4759import org .springframework .stereotype .Controller ;
4860
@@ -65,11 +77,19 @@ public class CsvController {
6577 private final TeamProvider teamProvider ;
6678 private final TeamConverter teamConverter ;
6779
80+ private final GroupLinkCsv groupLinkCsv ;
81+ private final GroupLinkProvider groupLinkProvider ;
82+ private final GroupLinkConverter groupLinkConverter ;
83+
6884 private final RoleProvider roleProvider ;
85+ private final TournamentProvider tournamentProvider ;
86+ private final GroupProvider groupProvider ;
6987
7088 public CsvController (ClubCsv clubCsv , ClubProvider clubProvider , ClubConverter clubConverter ,
7189 ParticipantCsv participantCsv , ParticipantProvider participantProvider , ParticipantConverter participantConverter ,
72- TeamCsv teamCsv , TeamProvider teamProvider , TeamConverter teamConverter , RoleProvider roleProvider ) {
90+ TeamCsv teamCsv , TeamProvider teamProvider , TeamConverter teamConverter , GroupLinkCsv groupLinkCsv ,
91+ GroupLinkProvider groupLinkProvider , GroupLinkConverter groupLinkConverter , RoleProvider roleProvider ,
92+ TournamentProvider tournamentProvider , GroupProvider groupProvider ) {
7393 this .clubCsv = clubCsv ;
7494 this .clubProvider = clubProvider ;
7595 this .clubConverter = clubConverter ;
@@ -79,7 +99,12 @@ public CsvController(ClubCsv clubCsv, ClubProvider clubProvider, ClubConverter c
7999 this .teamCsv = teamCsv ;
80100 this .teamProvider = teamProvider ;
81101 this .teamConverter = teamConverter ;
102+ this .groupLinkCsv = groupLinkCsv ;
103+ this .groupLinkProvider = groupLinkProvider ;
104+ this .groupLinkConverter = groupLinkConverter ;
82105 this .roleProvider = roleProvider ;
106+ this .tournamentProvider = tournamentProvider ;
107+ this .groupProvider = groupProvider ;
83108 }
84109
85110
@@ -183,4 +208,87 @@ private void setTeamMemberRoles(Team team) {
183208 }
184209 });
185210 }
211+
212+ public List <GroupLinkDTO > addGroupLinks (Integer tournamentId , String csvContent , String uploadedBy ) {
213+ final Tournament tournament = tournamentProvider .get (tournamentId )
214+ .orElseThrow (() -> new TournamentNotFoundException (getClass (), "No tournament found with id '" + tournamentId + "'," ,
215+ ExceptionType .INFO ));
216+
217+ //Define groups of the tournament.
218+ final int totalSourceGroups = groupLinkCsv .getSourceGroupSize (csvContent );
219+ final int totalDestinationGroups = groupLinkCsv .getDestinationGroupSize (csvContent );
220+ final int levels = generateCustomGroupTree (tournament , totalSourceGroups , totalDestinationGroups );
221+
222+ //Assign the links
223+ groupLinkProvider .deleteByTournament (tournament );
224+ final List <GroupLink > groupLinks = groupLinkCsv .readCSV (tournament , csvContent );
225+ final List <GroupLinkDTO > failedGroupLinks = new ArrayList <>();
226+
227+ //Set the links.
228+ for (GroupLink groupLink : groupLinks ) {
229+ groupLink .setTournament (tournament );
230+ groupLink .setUpdatedBy (uploadedBy );
231+ try {
232+ groupLinkProvider .save (groupLink );
233+ } catch (Exception e ) {
234+ KendoTournamentLogger .errorMessage (this .getClass (), e );
235+ failedGroupLinks .add (groupLinkConverter .convert (new GroupLinkConverterRequest (groupLink )));
236+ }
237+ }
238+
239+ generateInnerLevelLinks (tournament , levels );
240+
241+ return failedGroupLinks ;
242+ }
243+
244+ private List <GroupLink > generateInnerLevelLinks (Tournament tournament , int totalLevels ) {
245+ //Update other levels links.
246+ final List <Group > groupsOfTournament = groupProvider .getGroups (tournament );
247+ return groupLinkProvider .save (groupLinkProvider .generateLinks (
248+ groupsOfTournament ,
249+ 1 , totalLevels , 1 ));
250+ }
251+
252+
253+ private int generateCustomGroupTree (Tournament tournament , int levelZeroSize , int levelOneSize ) {
254+ groupProvider .delete (tournament );
255+
256+ //Define Level 0
257+ for (int i = 0 ; i < levelZeroSize ; i ++) {
258+ final Group levelGroup = new Group (tournament , 0 , i );
259+ groupProvider .addGroup (tournament , levelGroup );
260+ }
261+
262+ //Define Level 1
263+ for (int i = 0 ; i < levelOneSize ; i ++) {
264+ final Group levelGroup = new Group (tournament , 1 , i );
265+ groupProvider .addGroup (tournament , levelGroup );
266+ }
267+
268+ //Define other levels groups.
269+ int previousLevelSize = levelOneSize ;
270+ int newLevel = 2 ;
271+ while (previousLevelSize > 1 ) {
272+ final List <Group > generatedGroups = generateGroupsOnLevel (tournament , previousLevelSize , newLevel );
273+ previousLevelSize = generatedGroups .size ();
274+ newLevel ++;
275+ }
276+ return newLevel - 1 ;
277+ }
278+
279+ private List <Group > generateGroupsOnLevel (Tournament tournament , int lastLevelSize , int currentLevel ) {
280+ if (lastLevelSize <= 1 ) {
281+ return List .of ();
282+ }
283+
284+ //On inner tree, always one winner by group.
285+ final int groupSize = (lastLevelSize + 1 ) / 2 ;
286+
287+ final List <Group > groups = new ArrayList <>();
288+ for (int i = 0 ; i < groupSize ; i ++) {
289+ final Group levelGroup = new Group (tournament , currentLevel , i );
290+ groups .add (groupProvider .addGroup (tournament , levelGroup ));
291+ }
292+ return groups ;
293+ }
186294}
0 commit comments