package kickr.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import kickr.web.model.match.CoreMatchData;
import kickr.web.model.PlayerData;
import kickr.web.model.FoosballTableData;
import kickr.web.model.TeamData;
import kickr.db.dao.FoosballTableDAO;
import kickr.db.dao.GameDAO;
import kickr.db.dao.MatchDAO;
import kickr.db.dao.PlayerDAO;
import kickr.db.entity.FoosballTable;
import kickr.db.entity.Game;
import kickr.db.entity.Match;
import kickr.db.entity.MatchResult;
import kickr.db.entity.Player;
import kickr.db.entity.Team;
import kickr.db.entity.user.User;
import kickr.util.MatchResultDetails;
public class MatchService {
protected MatchDAO matchDao;
protected PlayerDAO playerDao;
protected FoosballTableDAO tableDao;
protected GameDAO gameDao;
public MatchService(MatchDAO matchDao, GameDAO gameDao, PlayerDAO playerDao, FoosballTableDAO tableDao) {
this.matchDao = matchDao;
this.gameDao = gameDao;
this.playerDao = playerDao;
this.tableDao = tableDao;
}
protected FoosballTable selectTable(FoosballTableData tableData) {
return tableDao.findTableById(tableData.getId());
}
protected Player selectOrInsertPlayer(PlayerData playerData) {
Player player = playerDao.findPlayerByAlias(playerData.getAlias());
if (player == null) {
player = playerData.toPlayer();
playerDao.create(player);
}
return player;
}
public Match insertMatch(CoreMatchData matchData, User creator) {
Match match = new Match();
// assign table
match.setTable(selectTable(matchData.getTable()));
// creator
match.setCreator(creator);
// assign teams
TeamData team1Data = matchData.getTeam1();
Player offenseTeam1 = selectOrInsertPlayer(team1Data.getOffense());
Team team1 = new Team(offenseTeam1, team1Data.getDefense() != null ? selectOrInsertPlayer(team1Data.getDefense()) : offenseTeam1);
TeamData team2Data = matchData.getTeam2();
Player offenseTeam2 = selectOrInsertPlayer(team2Data.getOffense());
Team team2 = new Team(offenseTeam2, team2Data.getDefense() != null ? selectOrInsertPlayer(team2Data.getDefense()) : offenseTeam2);
match.setTeam1(team1);
match.setTeam2(team2);
// assign played date
match.setPlayed(new Date());
// create games
List<Game> games = new ArrayList<>();
for (int i = 0; i < matchData.getGames().size(); i++) {
Game game = matchData.getGames().get(i).toGame();
game.setGameNumber(i);
games.add(game);
gameDao.create(game);
}
match.setGames(games);
MatchResultDetails resultDetails = MatchResultDetails.compute(match);
match.setResult(MatchResult.create(resultDetails));
matchDao.create(match);
return match;
}
}