package com.flexpoker.table.command.aggregate; import java.util.UUID; import com.flexpoker.model.HandRanking; import com.flexpoker.model.card.CardRank; public class HandEvaluation implements Comparable<HandEvaluation> { private UUID playerId; private HandRanking handRanking; private CardRank primaryCardRank; private CardRank secondaryCardRank; private CardRank firstKicker; private CardRank secondKicker; private CardRank thirdKicker; private CardRank fourthKicker; public UUID getPlayerId() { return playerId; } public void setPlayerId(UUID playerId) { this.playerId = playerId; } public HandRanking getHandRanking() { return handRanking; } public void setHandRanking(HandRanking handRanking) { this.handRanking = handRanking; } public CardRank getPrimaryCardRank() { return primaryCardRank; } public void setPrimaryCardRank(CardRank primaryCardRank) { this.primaryCardRank = primaryCardRank; } public CardRank getSecondaryCardRank() { return secondaryCardRank; } public void setSecondaryCardRank(CardRank secondaryCardRank) { this.secondaryCardRank = secondaryCardRank; } public CardRank getFirstKicker() { return firstKicker; } public void setFirstKicker(CardRank firstKicker) { this.firstKicker = firstKicker; } public CardRank getSecondKicker() { return secondKicker; } public void setSecondKicker(CardRank secondKicker) { this.secondKicker = secondKicker; } public CardRank getThirdKicker() { return thirdKicker; } public void setThirdKicker(CardRank thirdKicker) { this.thirdKicker = thirdKicker; } public CardRank getFourthKicker() { return fourthKicker; } public void setFourthKicker(CardRank fourthKicker) { this.fourthKicker = fourthKicker; } @Override public int compareTo(HandEvaluation otherHandEvaluation) { if (handRanking != otherHandEvaluation.handRanking) { return handRanking.compareTo(otherHandEvaluation.handRanking); } switch (handRanking) { case HIGH_CARD: return highCardCompareTo(otherHandEvaluation); case ONE_PAIR: return onePairCompareTo(otherHandEvaluation); case TWO_PAIR: return twoPairCompareTo(otherHandEvaluation); case THREE_OF_A_KIND: return threeOfAKindCompareTo(otherHandEvaluation); case STRAIGHT: return straightCompareTo(otherHandEvaluation); case FLUSH: return flushCompareTo(otherHandEvaluation); case FULL_HOUSE: return fullHouseCompareTo(otherHandEvaluation); case FOUR_OF_A_KIND: return fourOfAKindCompareTo(otherHandEvaluation); case STRAIGHT_FLUSH: return straightFlushCompareTo(otherHandEvaluation); default: throw new IllegalArgumentException("The given HandEvaluation " + "could not be correctly compared."); } } private int highCardCompareTo(HandEvaluation otherHandEvaluation) { if (primaryCardRank.equals(otherHandEvaluation.primaryCardRank)) { if (firstKicker.equals(otherHandEvaluation.firstKicker)) { if (secondKicker.equals(otherHandEvaluation.secondKicker)) { if (thirdKicker.equals(otherHandEvaluation.thirdKicker)) { return fourthKicker.compareTo(otherHandEvaluation.fourthKicker); } return thirdKicker.compareTo(otherHandEvaluation.thirdKicker); } return secondKicker.compareTo(otherHandEvaluation.secondKicker); } return firstKicker.compareTo(otherHandEvaluation.firstKicker); } return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int onePairCompareTo(HandEvaluation otherHandEvaluation) { if (primaryCardRank.equals(otherHandEvaluation.primaryCardRank)) { if (firstKicker.equals(otherHandEvaluation.firstKicker)) { if (secondKicker.equals(otherHandEvaluation.secondKicker)) { return thirdKicker.compareTo(otherHandEvaluation.thirdKicker); } return secondKicker.compareTo(otherHandEvaluation.secondKicker); } return firstKicker.compareTo(otherHandEvaluation.firstKicker); } return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int twoPairCompareTo(HandEvaluation otherHandEvaluation) { if (primaryCardRank.equals(otherHandEvaluation.primaryCardRank)) { if (secondaryCardRank.equals(otherHandEvaluation.secondaryCardRank)) { return firstKicker.compareTo(otherHandEvaluation.firstKicker); } return secondaryCardRank.compareTo(otherHandEvaluation.secondaryCardRank); } return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int threeOfAKindCompareTo(HandEvaluation otherHandEvaluation) { if (primaryCardRank.equals(otherHandEvaluation.primaryCardRank)) { if (firstKicker.equals(otherHandEvaluation.firstKicker)) { return secondKicker.compareTo(otherHandEvaluation.secondKicker); } return firstKicker.compareTo(otherHandEvaluation.firstKicker); } return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int straightCompareTo(HandEvaluation otherHandEvaluation) { return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int flushCompareTo(HandEvaluation otherHandEvaluation) { if (primaryCardRank.equals(otherHandEvaluation.primaryCardRank)) { if (firstKicker.equals(otherHandEvaluation.firstKicker)) { if (secondKicker.equals(otherHandEvaluation.secondKicker)) { if (thirdKicker.equals(otherHandEvaluation.thirdKicker)) { return fourthKicker.compareTo(otherHandEvaluation.fourthKicker); } return thirdKicker.compareTo(otherHandEvaluation.thirdKicker); } return secondKicker.compareTo(otherHandEvaluation.secondKicker); } return firstKicker.compareTo(otherHandEvaluation.firstKicker); } return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int fullHouseCompareTo(HandEvaluation otherHandEvaluation) { if (primaryCardRank.equals(otherHandEvaluation.primaryCardRank)) { return secondaryCardRank.compareTo(otherHandEvaluation.secondaryCardRank); } return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int fourOfAKindCompareTo(HandEvaluation otherHandEvaluation) { if (primaryCardRank.equals(otherHandEvaluation.primaryCardRank)) { return firstKicker.compareTo(otherHandEvaluation.firstKicker); } return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } private int straightFlushCompareTo(HandEvaluation otherHandEvaluation) { return primaryCardRank.compareTo(otherHandEvaluation.primaryCardRank); } }