package org.iatoki.judgels.uriel.runnables;
import com.google.gson.Gson;
import org.iatoki.judgels.sandalphon.Submission;
import org.iatoki.judgels.sandalphon.services.SubmissionService;
import org.iatoki.judgels.uriel.Contest;
import org.iatoki.judgels.uriel.ContestConfiguration;
import org.iatoki.judgels.uriel.ScoreboardState;
import org.iatoki.judgels.uriel.ContestScoreboard;
import org.iatoki.judgels.uriel.ContestScoreboardType;
import org.iatoki.judgels.uriel.StandardContestTypeConfig;
import org.iatoki.judgels.uriel.adapters.ScoreboardAdapter;
import org.iatoki.judgels.uriel.adapters.impls.ScoreboardAdapters;
import org.iatoki.judgels.uriel.Scoreboard;
import org.iatoki.judgels.uriel.ScoreboardContent;
import org.iatoki.judgels.uriel.services.ContestScoreboardService;
import org.iatoki.judgels.uriel.services.ContestService;
import play.db.jpa.JPA;
import java.util.Date;
import java.util.List;
public final class ScoreboardUpdater implements Runnable {
private final ContestService contestService;
private final ContestScoreboardService contestScoreboardService;
private final SubmissionService submissionService;
public ScoreboardUpdater(ContestService contestService, ContestScoreboardService contestScoreboardService, SubmissionService submissionService) {
this.contestService = contestService;
this.contestScoreboardService = contestScoreboardService;
this.submissionService = submissionService;
}
@Override
public void run() {
JPA.withTransaction(() -> {
Date timeNow = new Date();
for (Contest contest : contestService.getRunningContests(timeNow)) {
if (contest.isUsingScoreboard()) {
ScoreboardAdapter adapter = ScoreboardAdapters.fromContestStyle(contest.getStyle());
ContestScoreboard contestScoreboard = contestScoreboardService.findContestScoreboardByContestJidAndScoreboardType(contest.getJid(), ContestScoreboardType.OFFICIAL);
ContestConfiguration contestConfiguration = contestService.findContestConfigurationByContestJid(contest.getJid());
if ((contest.isStandard()) && (!contestScoreboardService.isContestScoreboardExistByContestJidAndScoreboardType(contest.getJid(), ContestScoreboardType.FROZEN)) && (System.currentTimeMillis() > ((StandardContestTypeConfig) new Gson().fromJson(contestConfiguration.getTypeConfig(), StandardContestTypeConfig.class)).getScoreboardFreezeTime())) {
contestScoreboardService.upsertFrozenScoreboard(contestScoreboard.getId());
}
ScoreboardState state = contestService.getContestStateByJid(contest.getJid());
List<Submission> submissions = submissionService.findAllSubmissionsByContestJid(contest.getJid());
ScoreboardContent content = adapter.computeScoreboardContent(contest, contestConfiguration.getStyleConfig(), state, submissions, contestScoreboardService.getMapContestantJidToImageUrlInContest(contest.getJid()));
Scoreboard scoreboard = adapter.createScoreboard(state, content);
contestScoreboardService.updateContestScoreboardByContestJidAndScoreboardType(contest.getJid(), ContestScoreboardType.OFFICIAL, scoreboard);
}
}
});
}
}