package com.poker.analyst.combination;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import com.poker.analyst.analyser.CardComparator;
import com.poker.analyst.combinations.auxil.CardRangeInComb;
import com.poker.analyst.combinations.auxil.CardValue;
import com.poker.analyst.element.Card;
import com.poker.analyst.element.CardFace;
import com.poker.analyst.element.Hand;
import com.poker.analyst.element.PlayingCards;
import com.poker.analyst.element.Suit;
public class AvailableCombinationsTools {
AvailableCombinations availableCombinations;
public AvailableCombinationsTools(AvailableCombinations availableCombinations) {
super();
this.availableCombinations = availableCombinations;
}
public List<CardValue> getCardValuesFromComb(Combination combination, Hand hand){
List<CardValue> cardValues = null;
CardValue cardValue = null;
List<Card> combCardList = combination.getCombinationList();
if (combCardList == null) return null;
if (hand == null) return null;
if (hand.getHandCards() == null) return null;
if (hand.getHandCards().length != 2) return null;
return updateCVRangeInALL(combination, combination.getCardValues(hand));
}
public List<CardValue> updateCVRangeInALL(Combination combination, List<CardValue> cardValues){
PlayingCards plCards = availableCombinations.getPlCards();
if (cardValues == null)
return cardValues;
if (combination instanceof Pair ||
combination instanceof TwoPairs ||
combination instanceof ThreeOfKind ||
combination instanceof FourOfKind ||
combination instanceof FourOfKind ||
combination instanceof FullHouse ){
Set<Card> allCards = new TreeSet<Card>(new CardComparator());
for (Card card: plCards.getPlayerCards())
if (card != null) allCards.add(new Card(Suit.forAnalyse,card.getFace()));
for (Card card: plCards.getTableCards())
if (card != null) allCards.add(new Card(Suit.forAnalyse,card.getFace()));
for (CardValue cv: cardValues){
int i = 0;
for (Card card: allCards){
if (card.getFace().equals(cv.getCard().getFace())){
if (cv.getCardRangeInAllCards() == null){
if (i == 0)
cv.setCardRangeInAllCards(CardRangeInComb.TOP);
else
if (i == allCards.size() - 1)
cv.setCardRangeInAllCards(CardRangeInComb.LOW);
else
cv.setCardRangeInAllCards(CardRangeInComb.MIDDLE);
cv.setCardPosition(i);
}
}
i++;
}
if (cardValues.size() ==2){
if ((cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.MIDDLE &&
cardValues.get(1).getCardRangeInAllCards() == CardRangeInComb.LOW) ||
(cardValues.get(1).getCardRangeInAllCards() == CardRangeInComb.MIDDLE &&
cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.LOW)){
if (Math.abs(cardValues.get(0).getCardPositionAllCards() -
cardValues.get(1).getCardPositionAllCards()) == 1){
cardValues.get(0).setCardRangeInAllCards(CardRangeInComb.LOW);
cardValues.get(1).setCardRangeInAllCards(CardRangeInComb.LOW);
}
}
if (cardValues.get(0).getCard().getFace().equals(cardValues.get(1).getCard().getFace())){
if (cardValues.get(0).getCardRangeInAllCards().equals(CardRangeInComb.TOP)){
cardValues.get(0).setCardRangeInAllCards(CardRangeInComb.HIGH);
cardValues.get(1).setCardRangeInAllCards(CardRangeInComb.HIGH);
}
}
}
}
}else
if (combination instanceof Straight ||
combination instanceof StraightFlush ||
combination instanceof Flush ){
for (CardValue cv: cardValues){
cv.setCardRangeInAllCards(cv.getCardRange());
}
}
return cardValues;
}
public Card getKicker(List<CardValue> listCardValues){
Hand hand = new Hand(availableCombinations.getPlCards().getPlayerCards());
Card kicker = null;
if (hand == null) return null;
if (hand.getHandCards() == null) return null;
if (hand.getHandCards().length != 2) return null;
if (listCardValues == null || listCardValues.size() == 0){
if (hand.getHandCards()[0].getFace().getSerialNumber() >=
hand.getHandCards()[1].getFace().getSerialNumber())
return hand.getHandCards()[0];
else
return hand.getHandCards()[1];
}
if (listCardValues.size() == 2){
return null;
}
boolean isNotInCV = true;
for (int q = 0; q<2; q++){
isNotInCV = true;
for(CardValue cv: listCardValues){
if (cv.getCard().equals(hand.getHandCards()[q]))
isNotInCV = false;
}
if (isNotInCV)
return hand.getHandCards()[q];
}
return kicker;
}
public Combination getTopCombination(){
if (availableCombinations.getStraightFlushes() != null)
return availableCombinations.getStraightFlushes().get(0);
if (availableCombinations.getFourOfKinds() != null)
return availableCombinations.getFourOfKinds().get(0);
if (availableCombinations.getFullHouses() != null)
return availableCombinations.getFullHouses().get(0);
if (availableCombinations.getFlushs() != null)
return availableCombinations.getFlushs().get(0);
if (availableCombinations.getStraights() != null)
return availableCombinations.getStraights().get(0);
if (availableCombinations.getThreeOfKinds() != null)
return availableCombinations.getThreeOfKinds().get(0);
if (availableCombinations.getTwoPairs() != null)
return availableCombinations.getTwoPairs().get(0);
if (availableCombinations.getPairs() != null)
return availableCombinations.getPairs().get(0);
if (availableCombinations.getHighCard() != null)
return availableCombinations.getHighCard().get(0);
return null;
}
public Flush analyzeFlush(boolean isDraw){
Hand hand = new Hand(availableCombinations.getPlCards().getPlayerCards());
Flush topFlush = null;
List<CardValue> cardValues = null;
List<Flush> listFlushes;
if (isDraw)
listFlushes = availableCombinations.getFlushDraws();
else
listFlushes = availableCombinations.getFlushs();
boolean tmp = false;
if (listFlushes != null && listFlushes.size() != 0){
topFlush = listFlushes.get(0);
cardValues = getCardValuesFromComb(topFlush, hand);
if (cardValues == null)
topFlush = null;
else{
if (listFlushes.size() > 1){
tmp = false;
for(CardValue cv: cardValues){
if (cv.getCard().getFace() == CardFace.ACE || cv.getCard().getFace() == CardFace.KING)
tmp = true;
}
if (!tmp)
topFlush = null;
}else{
if (cardValues.size() == 1){
if (cardValues.get(0).getCard().getFace() != CardFace.ACE &&
cardValues.get(0).getCard().getFace() != CardFace.KING &&
cardValues.get(0).getCard().getFace() != CardFace.QUEEN)
topFlush = null;
}else{
if (cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.LOW &&
cardValues.get(1).getCardRangeInAllCards() == CardRangeInComb.LOW)
topFlush = null;
}
}
}
}
return topFlush;
}
public Straight analyzeStraight(boolean isDraw){
Hand hand = new Hand(availableCombinations.getPlCards().getPlayerCards());
Straight topStraight = null;
List<CardValue> cardValues = null;
List<Straight> listStraights;
if (isDraw)
listStraights = availableCombinations.getStraightOesds();
else
listStraights = availableCombinations.getStraights();
boolean tmp = false;
if (listStraights != null && listStraights.size() != 0){
topStraight = listStraights.get(0);
cardValues = getCardValuesFromComb(topStraight, hand);
if (cardValues == null)
topStraight = null;
else{
if (cardValues.size() == 1 && cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.LOW)
topStraight = null;
}
}
return topStraight;
}
public Combination cutNotHeroCombination(Combination combination){
Hand hand = new Hand(availableCombinations.getPlCards().getPlayerCards());
if (combination == null) return null;
List<CardValue> cardValues = getCardValuesFromComb(combination, hand);
if (cardValues == null || cardValues.size() == 0)
return null;
return combination;
}
public Combination analyzePair(Combination combination,
boolean isTop, boolean isMiddle,
CardFace kickerTop,CardFace kickerMiddle){
Hand hand = new Hand(availableCombinations.getPlCards().getPlayerCards());
Pair pair = (Pair)combination;
List<CardValue> cardValues = getCardValuesFromComb(combination, hand);
Card kicker;
if (cardValues == null)
combination = null;
else
if (cardValues.size() == 1){
if (cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.LOW)
combination = null;
if (isTop && cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.TOP &&
getKicker(cardValues).getFace().getSerialNumber()< kickerTop.getSerialNumber())
combination = null;
if (isMiddle){
kicker = getKicker(cardValues);
if (cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.MIDDLE &&
kicker != null && kicker.getFace().getSerialNumber() < kickerMiddle.getSerialNumber())
combination = null;
else
if (cardValues.get(0).getCardPositionAllCards() >1)
combination = null;
}
}else
if (cardValues.size() == 2){
if (cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.LOW ||
cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.MIDDLE)
combination = null;
}
return combination;
}
public Combination analyzeTwoPair(Combination combination, boolean isMiddle){
Hand hand = new Hand(availableCombinations.getPlCards().getPlayerCards());
TwoPairs pair = (TwoPairs) combination;
List<CardValue> cardValues = getCardValuesFromComb(combination, hand);
if (cardValues == null)
combination = null;
else
if (cardValues.size() == 1){
if (cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.LOW)
combination = null;
if (isMiddle){
if (cardValues.get(0).getCardPositionAllCards() > 1)
combination = null;
}else
{
if (cardValues.get(0).getCardRangeInAllCards() == CardRangeInComb.MIDDLE)
combination = null;
}
}
return combination;
}
}