package models; import com.google.common.base.Predicate; import org.joda.time.DateTime; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import static com.google.common.collect.Collections2.filter; import static java.math.RoundingMode.HALF_UP; public class Versus { public Player player1; public Player player2; public List<Comparison> comparisons = new ArrayList<Comparison>(); public Versus(Player player1, Player player2) { this.player1 = player1; this.player2 = player2; } public void add(Comparison comparison) { this.comparisons.add(comparison); } public int loseCount() { return filter(comparisons, new Predicate<Comparison>() { @Override public boolean apply(Comparison comparison) { return comparison.isLostByPlayer1(); } }).size(); } public int winCount() { return filter(comparisons, new Predicate<Comparison>() { @Override public boolean apply(Comparison comparison) { return comparison.isWonByPlayer1(); } }).size(); } public static class Comparison { public final Game game; public final Difficulty difficulty; public final Mode mode; public final Score score1; public final Score score2; public Comparison(Game game, Difficulty difficulty, Mode mode, Score score1, Score score2) { this.game = game; this.difficulty = difficulty; this.mode = mode; this.score1 = score1; this.score2 = score2; } public int scoreGap() { Score scoreA, scoreB; if (score1.isTimeScore()) { scoreA = score2; scoreB = score1; DateTime dateTimeA = new DateTime(scoreA.value.longValue()); DateTime dateTimeB = new DateTime(scoreB.value.longValue()); double a = dateTimeA.getMinuteOfDay() * 60000 + dateTimeA.getSecondOfMinute() * 1000 + dateTimeA.getMillisOfSecond(); double b = dateTimeB.getMinuteOfDay() * 60000 + dateTimeB.getSecondOfMinute() * 1000 + dateTimeB.getMillisOfSecond(); return (int) ((a * 100D) / b) - 100; } else { scoreA = score1; scoreB = score2; } return scoreA.value.multiply(BigDecimal.valueOf(100)).divide(scoreB.value, HALF_UP).intValue() - 100; } public boolean isLostByPlayer1() { return score1.isWorstThan(score2); } public boolean isWonByPlayer1() { return score2.isWorstThan(score1); } } }