diff --git a/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java b/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java index aea0f77..d0a8eaf 100644 --- a/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java +++ b/src/main/java/nl/connectedit/swiss/dto/TournamentDto.java @@ -34,4 +34,10 @@ public class TournamentDto extends AbstractDto { private List substitutions; + private List playersPlaying; + + private List playersCounting; + + private List playersAvailable; + } diff --git a/src/main/java/nl/connectedit/swiss/mapper/TournamentMapper.java b/src/main/java/nl/connectedit/swiss/mapper/TournamentMapper.java index fc803a6..a2e89de 100644 --- a/src/main/java/nl/connectedit/swiss/mapper/TournamentMapper.java +++ b/src/main/java/nl/connectedit/swiss/mapper/TournamentMapper.java @@ -1,86 +1,174 @@ package nl.connectedit.swiss.mapper; import lombok.RequiredArgsConstructor; +import nl.connectedit.swiss.domain.EventType; +import nl.connectedit.swiss.domain.Status; import nl.connectedit.swiss.domain.TournamentStatus; -import nl.connectedit.swiss.domain.entity.Event; -import nl.connectedit.swiss.domain.entity.Tournament; -import nl.connectedit.swiss.domain.entity.TournamentPlayer; +import nl.connectedit.swiss.domain.entity.*; import nl.connectedit.swiss.dto.TournamentDto; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; @Component @RequiredArgsConstructor public class TournamentMapper implements DtoMapper, EntityMapper { - private final EventMapper eventMapper; + private final EventMapper eventMapper; - private final TournamentPlayerMapper tournamentPlayerMapper; + private final TournamentPlayerMapper tournamentPlayerMapper; - @Override - public Tournament toEntity(TournamentDto tournamentDto) { - Tournament tournament = new Tournament(); - tournament.setId(tournamentDto.getId()); - tournament.setName(tournamentDto.getName()); - tournament.setDate(LocalDate.parse(tournamentDto.getDate(), DateTimeFormatter.ofPattern("dd-MM-yyyy"))); - tournament.setStatus( - Arrays.stream(TournamentStatus.values()) - .filter(ts -> ts.getText().equals(tournamentDto.getStatus())) - .findFirst() - .orElse(TournamentStatus.UPCOMING) - ); - tournament.setActive(tournamentDto.getActive()); - tournament.setMaxEvents(tournamentDto.getMaxEvents()); - tournament.setCostsPerEvent(tournamentDto.getCostsPerEvent()); - tournament.setCourts(tournamentDto.getCourts()); + @Override + public Tournament toEntity(TournamentDto tournamentDto) { + Tournament tournament = new Tournament(); + tournament.setId(tournamentDto.getId()); + tournament.setName(tournamentDto.getName()); + tournament.setDate(LocalDate.parse(tournamentDto.getDate(), DateTimeFormatter.ofPattern("dd-MM-yyyy"))); + tournament.setStatus( + Arrays.stream(TournamentStatus.values()) + .filter(ts -> ts.getText().equals(tournamentDto.getStatus())) + .findFirst() + .orElse(TournamentStatus.UPCOMING) + ); + tournament.setActive(tournamentDto.getActive()); + tournament.setMaxEvents(tournamentDto.getMaxEvents()); + tournament.setCostsPerEvent(tournamentDto.getCostsPerEvent()); + tournament.setCourts(tournamentDto.getCourts()); - return tournament; + return tournament; + } + + @Override + public TournamentDto toDto(Tournament tournament) { + TournamentDto tournamentDto = new TournamentDto(); + tournamentDto.setId(tournament.getId()); + tournamentDto.setName(tournament.getName()); + tournamentDto.setDate(tournament.getDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))); + tournamentDto.setStatus(tournament.getStatus().name()); + tournamentDto.setActive(tournament.getActive()); + tournamentDto.setEvents( + tournament.getEvents() + .stream() + .sorted(Comparator.comparing(Event::getType)) + .map(eventMapper::toDto) + .toList() + ); + + if (tournament.getTournamentPlayers() != null) { + var tournamentPlayers = tournament.getTournamentPlayers(); + + tournamentPlayers.sort(Comparator.comparing((TournamentPlayer tournamentPlayer) -> tournamentPlayer.getPlayer().getLastName()) + .thenComparing((TournamentPlayer tournamentPlayer) -> tournamentPlayer.getPlayer().getFirstName())); + + tournamentDto.setTournamentPlayers(tournamentPlayers + .stream() + .map(tournamentPlayerMapper::toDto) + .toList() + ); } - @Override - public TournamentDto toDto(Tournament tournament) { - TournamentDto tournamentDto = new TournamentDto(); - tournamentDto.setId(tournament.getId()); - tournamentDto.setName(tournament.getName()); - tournamentDto.setDate(tournament.getDate().format(DateTimeFormatter.ofPattern("dd-MM-yyyy"))); - tournamentDto.setStatus(tournament.getStatus().name()); - tournamentDto.setActive(tournament.getActive()); - tournamentDto.setEvents( - tournament.getEvents() - .stream() - .sorted(Comparator.comparing(Event::getType)) - .map(eventMapper::toDto) - .toList() - ); + tournamentDto.setMaxEvents(tournament.getMaxEvents() == null ? 2L : tournament.getMaxEvents()); - if (tournament.getTournamentPlayers() != null) { - var tournamentPlayers = tournament.getTournamentPlayers(); - - tournamentPlayers.sort(Comparator.comparing((TournamentPlayer tournamentPlayer) -> tournamentPlayer.getPlayer().getLastName()) - .thenComparing((TournamentPlayer tournamentPlayer) -> tournamentPlayer.getPlayer().getFirstName())); - - tournamentDto.setTournamentPlayers(tournamentPlayers - .stream() - .map(tournamentPlayerMapper::toDto) - .toList() - ); - } - - tournamentDto.setMaxEvents(tournament.getMaxEvents() == null ? 2L : tournament.getMaxEvents()); - - if (tournament.getCostsPerEvent() == null || tournament.getCostsPerEvent().isEmpty()) { - tournamentDto.setCostsPerEvent(List.of(0f, 0f, 0f)); - } else { - tournamentDto.setCostsPerEvent(tournament.getCostsPerEvent()); - } - - tournamentDto.setCourts(tournament.getCourts() == null ? 1L : tournament.getCourts()); - - return tournamentDto; + if (tournament.getCostsPerEvent() == null || tournament.getCostsPerEvent().isEmpty()) { + tournamentDto.setCostsPerEvent(List.of(0f, 0f, 0f)); + } else { + tournamentDto.setCostsPerEvent(tournament.getCostsPerEvent()); } -} + + tournamentDto.setCourts(tournament.getCourts() == null ? 1L : tournament.getCourts()); + + tournamentDto.setPlayersCounting(getPlayersCounting(tournament)); + tournamentDto.setPlayersPlaying(getPlayersPlaying(tournament)); + tournamentDto.setPlayersAvailable(getPlayersAvailable(tournament)); + + return tournamentDto; + } + + private List getPlayersCounting(Tournament tournament) { + var playersCounting = new ArrayList(); + + for (var event : tournament.getEvents()) { + for (var group : event.getGroups()) { + for (var round : group.getRounds()) { + for (var match : round.getMatches()) { + if (match.getStatus() == Status.IN_PROGRESS) { + var counter = getTournamentPlayerFromPlayerId(tournament, match.getCounter().getId()); + if (counter != null) { + playersCounting.add(counter.getId()); + } + } + } + } + } + } + return playersCounting; + } + + private List getPlayersPlaying(Tournament tournament) { + var playersPlaying = new ArrayList(); + + for (var event : tournament.getEvents()) { + for (var group : event.getGroups()) { + for (var round : group.getRounds()) { + for (var match : round.getMatches()) { + if (match.getStatus() == Status.IN_PROGRESS) { + playersPlaying.addAll(getPlayersInMatch(tournament, match)); + } + } + } + } + } + + return playersPlaying; + } + + private List getPlayersAvailable(Tournament tournament) { + var playersAvailable = tournament.getTournamentPlayers() + .stream() + .map(TournamentPlayer::getId) + .collect(Collectors.toCollection(ArrayList::new)); + + playersAvailable.removeAll(getPlayersCounting(tournament)); + playersAvailable.removeAll(getPlayersPlaying(tournament)); + + return playersAvailable; + } + + private List getPlayersInMatch(Tournament tournament, Match match) { + var playersInMatch = new ArrayList(); + playersInMatch.add(getPlayerOrSubstitute(tournament, match.getTeam1().getPlayer1(), match.getType()).getId()); + playersInMatch.add(getPlayerOrSubstitute(tournament, match.getTeam2().getPlayer1(), match.getType()).getId()); + if (match.getType().isDoublesEvent()) { + playersInMatch.add(getPlayerOrSubstitute(tournament, match.getTeam1().getPlayer2(), match.getType()).getId()); + playersInMatch.add(getPlayerOrSubstitute(tournament, match.getTeam2().getPlayer2(), match.getType()).getId()); + } + + return playersInMatch; + } + + private TournamentPlayer getPlayerOrSubstitute(Tournament tournament, Player player, EventType type) { + var tournamentPlayer = getTournamentPlayerFromPlayerId(tournament, player.getId()); + for (var substitution : tournamentPlayer.getSubstitutions()) { + if (substitution.getEvent().getType() == type && substitution.getSubstitute() != null) { + return substitution.getSubstitute(); + } + } + return tournamentPlayer; + } + + private TournamentPlayer getTournamentPlayerFromPlayerId(Tournament tournament, Long playerId) { + for (var tournamentPlayer : tournament.getTournamentPlayers()) { + if (tournamentPlayer.getPlayer().getId().equals(playerId)) { + return tournamentPlayer; + } + } + return null; + } + +} \ No newline at end of file