package com.vdom.comms;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.EnumSet;
import com.vdom.api.ActionCard;
import com.vdom.api.Card;
import com.vdom.api.TreasureCard;
import com.vdom.api.VictoryCard;
import com.vdom.core.Cards;
import com.vdom.core.MoveContext;
/**
* Gives information about cards that are selected by the player from the table (piles, hand, play)
*
* This clas gives information about the constrains set on the selection of cards, e.g. what type, cost, from which place
*
*/
public class SelectCardOptions implements Serializable {
private static final long serialVersionUID = -1473106875075390348L;
public enum ActionType {
REVEAL, DISCARD, DISCARDFORCOIN, DISCARDFORCARD, GAIN, TRASH, NAMECARD, OPPONENTDISCARD
}
public enum PickType {
SELECT(""),
SELECT_WITH_ALL(" T"),
SELECT_IN_ORDER(" T"),
PLAY (""),
PLAY_IN_ORDER(" 1"),
BUY (""),
DISCARD (" D"),
KEEP (" K"),
GIVE (" P"),
TRASH (" X"),
UPGRADE ("X"),
MINT ("M"),
SWINDLE ("");
private final String indicator;
PickType(String indicator) {
this.indicator= indicator;
}
public String indicator() { return indicator; }
}
public PickType pickType = PickType.SELECT;
public int defaultCardSelected = -1;
public boolean fromHand = false;
public int count = Integer.MAX_VALUE;
public boolean exactCount = false;
public boolean ordered = false;
public boolean isNonRats = false;
public boolean fromTable = false;
public boolean isBuyPhase = false;
public boolean allowEmpty = false;
public int minCost = Integer.MIN_VALUE;
public int maxCost = Integer.MAX_VALUE;
public int maxCostWithoutPotion = Integer.MAX_VALUE;
public int copperCountInPlay = 0;
public int potionCost = -1;
public boolean fromPrizes = false;
public boolean isAction = false;
public boolean isReaction = false;
public boolean isTreasure = false;
public boolean isNonTreasure = false;
public boolean isVictory = false;
public boolean isNonVictory = false;
public boolean isAttack = false;
public boolean isNonShelter = false;
public String passString = null;
public String header = null;
public ArrayList<Integer> allowedCards = new ArrayList<Integer>();
// public SelectCardOptions setType(SelectType s) {selectType = s; return this;}
public SelectCardOptions setHeader(String s) {header = s; return this;}
public SelectCardOptions setPassable(String s) {passString = s; return this;}
public SelectCardOptions setPickType(PickType pickType) {this.pickType = pickType;return this;}
public SelectCardOptions fromHand() {fromHand = true; return this;}
public SelectCardOptions defaultCardSelected(int c) {defaultCardSelected = c; return this;}
public SelectCardOptions isNonShelter() {isNonShelter = true; return this;}
public SelectCardOptions isNonRats() {isNonRats = true; return this;}
public SelectCardOptions ordered() {ordered = true; this.pickType = PickType.SELECT_IN_ORDER; return this;}
public SelectCardOptions setCount(int c) {count = c; return this;}
public SelectCardOptions exactCount() {exactCount = true; return this;}
public SelectCardOptions fromTable() {fromTable = true;isNonShelter=true;count=1;exactCount=true; return this;}
public SelectCardOptions isBuy() {isBuyPhase= true; this.pickType = PickType.BUY; return this;}
public SelectCardOptions allowEmpty() {allowEmpty = true; return this;}
public SelectCardOptions fromPrizes() {fromPrizes = true; return this;}
public SelectCardOptions minCost(int c) {minCost = c; return this;}
public SelectCardOptions maxCost(int c) {maxCost = c; maxCostWithoutPotion = c; return this;}
public SelectCardOptions exactCost(int c) {minCost = c; maxCost = c; maxCostWithoutPotion = c; return this;}
public SelectCardOptions potionCost(int c) {potionCost = c; return this;}
public SelectCardOptions maxCostWithoutPotion() {maxCostWithoutPotion = maxCost + (maxCost < Integer.MAX_VALUE && potionCost > 0 ? 1 : 0); return this;}
public SelectCardOptions copperCountInPlay(int c) {copperCountInPlay = c; return this; }
public SelectCardOptions isAction() {isAction = true; return this;}
public SelectCardOptions isReaction() {isReaction = true; return this;}
public SelectCardOptions isTreasure() {isTreasure = true; return this;}
public SelectCardOptions isNonTreasure() {isNonTreasure = true; return this;}
public SelectCardOptions isVictory() {isVictory = true; return this;}
public SelectCardOptions isNonVictory() {isNonVictory = true; return this;}
public SelectCardOptions isAttack() {isAttack = true; return this;}
public SelectCardOptions allowedCards(int[] is) {
for (int i : is)
addValidCard(i);
return this;
}
public PickType getPickType() {
return pickType;
}
public boolean cardInList(int card) {
if (allowedCards.size() == 0)
return true;
return allowedCards.contains(new Integer(card));
}
// Return the number of cards that have matched the filter
public int getAllowedCardCount() {
return allowedCards.size();
}
public void addValidCard(int card) {
allowedCards.add(new Integer(card));
}
public boolean checkValid(MyCard c) {
return checkValid(c, 0);
}
public boolean checkValid(MyCard c, int cost) {
if ((maxCost >= 0) && (cost > maxCost )) return false;
if ((minCost >= 0) && (cost < minCost)) return false;
if (isAction && !c.isAction) return false;
if (isReaction && !c.isReaction) return false;
if (isTreasure && !c.isTreasure) return false;
if (isNonTreasure && c.isTreasure) return false;
if (isVictory && !c.isVictory) return false;
if (isNonVictory && c.isVictory) return false;
if (isAttack && !c.isAttack) return false;
if (isNonShelter && c.isShelter) return false;
if (isReaction && !c.isReaction) return false;
if (fromPrizes && !c.isPrize) return false;
if (fromTable && !fromPrizes && c.isPrize) return false;
//if (fromPrizes && !c.isPrize && !fromTable) return false;
if (potionCost == 0 && c.costPotion) return false;
if (maxCost == minCost && potionCost > 0 && !c.costPotion) return false;
if (!cardInList(c.id)) return false;
return true;
}
public boolean checkValid(Card c) {
return checkValid(c, 0);
}
public boolean checkValid(Card c, int cost) {
if ((maxCost >= 0) && (cost > (c.costPotion() ? maxCost : maxCostWithoutPotion))) return false;
if ((minCost >= 0) && (cost < minCost)) return false;
if (isReaction && !(Cards.isReaction(c))) return false;
if (isTreasure && !(c instanceof TreasureCard)) return false;
if (isNonTreasure && (c instanceof TreasureCard)) return false;
if (isVictory && !(c instanceof VictoryCard)) return false;
if (isNonVictory && (c instanceof VictoryCard)) return false;
if (fromPrizes && !c.isPrize()) return false;
if (fromTable && !fromPrizes && c.isPrize()) return false;
if (potionCost == 0 && c.costPotion()) return false;
if (maxCost == minCost && potionCost > 0 && !c.costPotion()) return false;
if (isNonRats && c.equals(Cards.rats)) return false;
if (c.equals(Cards.grandMarket) && copperCountInPlay > 0) return false;
if (isNonShelter && c.isShelter()) return false;
if (c instanceof ActionCard) {
if (isAttack && !(((ActionCard) c).isAttack())) return false;
} else {
if (isAction || isAttack) return false;
}
if (isBuyPhase && !Cards.isSupplyCard(c)) return false;
return true;
}
public boolean isPassable() {
return (passString != null && !passString.trim().equals(""));
}
public String potionString() {
String potionString = "";
if (potionCost == 1) {
potionString = "p";
} else if (potionCost > 1) {
potionString = "p" + potionCost;
}
return potionString;
}
}