package magic.model;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
public enum MagicCostManaType {
// Ordered from least restrictive to most restrictive.
// Same order as in mana cost
Generic("generic","{1}",Arrays.asList(MagicManaType.Colorless,MagicManaType.White,MagicManaType.Blue,MagicManaType.Black,MagicManaType.Red,MagicManaType.Green)),
WhiteBlue("white/blue","{W/U}",Arrays.asList(MagicManaType.White,MagicManaType.Blue)),
WhiteBlack("white/black","{W/B}",Arrays.asList(MagicManaType.White,MagicManaType.Black)),
BlueBlack("blue/black","{U/B}",Arrays.asList(MagicManaType.Blue,MagicManaType.Black)),
BlueRed("blue/red","{U/R}",Arrays.asList(MagicManaType.Blue,MagicManaType.Red)),
BlackRed("black/red","{B/R}",Arrays.asList(MagicManaType.Black,MagicManaType.Red)),
BlackGreen("black/green","{B/G}",Arrays.asList(MagicManaType.Black,MagicManaType.Green)),
RedGreen("red/green","{R/G}",Arrays.asList(MagicManaType.Red,MagicManaType.Green)),
RedWhite("red/white","{R/W}",Arrays.asList(MagicManaType.Red,MagicManaType.White)),
GreenWhite("green/white","{G/W}",Arrays.asList(MagicManaType.Green,MagicManaType.White)),
GreenBlue("green/blue","{G/U}",Arrays.asList(MagicManaType.Green,MagicManaType.Blue)),
PhyrexianWhite("phyrexian white","{W/P}",Arrays.asList(MagicManaType.White)),
PhyrexianBlue("phyrexian blue","{U/P}",Arrays.asList(MagicManaType.Blue)),
PhyrexianBlack("phyrexian black","{B/P}",Arrays.asList(MagicManaType.Black)),
PhyrexianRed("phyrexian red","{R/P}",Arrays.asList(MagicManaType.Red)),
PhyrexianGreen("phyrexian green","{G/P}",Arrays.asList(MagicManaType.Green)),
HybridWhite("hybrid white","{2/W}",Arrays.asList(MagicManaType.White)),
HybridBlue("hybrid blue","{2/U}",Arrays.asList(MagicManaType.Blue)),
HybridBlack("hybrid black","{2/B}",Arrays.asList(MagicManaType.Black)),
HybridRed("hybrid red","{2/R}",Arrays.asList(MagicManaType.Red)),
HybridGreen("hybrid green","{2/G}",Arrays.asList(MagicManaType.Green)),
White("white","{W}",Arrays.asList(MagicManaType.White)),
Blue("blue","{U}",Arrays.asList(MagicManaType.Blue)),
Black("black","{B}",Arrays.asList(MagicManaType.Black)),
Red("red","{R}",Arrays.asList(MagicManaType.Red)),
Green("green","{G}",Arrays.asList(MagicManaType.Green)),
Snow("snow","{S}",Arrays.asList(MagicManaType.Snow)),
Colorless("colorless","{C}",Arrays.asList(MagicManaType.Colorless))
;
public static final int NR_OF_TYPES=values().length;
public static final EnumSet<MagicCostManaType> MONO = EnumSet.range(White, Green);
public static final EnumSet<MagicCostManaType> HYBRID = EnumSet.range(WhiteBlue, GreenBlue);
public static final EnumSet<MagicCostManaType> NON_MONO = EnumSet.complementOf(MONO);
private final String name;
private final String text;
private final List<MagicManaType> types;
private MagicCostManaType(final String name,final String text,final List<MagicManaType> types) {
this.name=name;
this.text=text;
this.types=types;
}
public MagicCostManaType next() {
switch (this) {
case White: return Blue;
case Blue: return Black;
case Black: return Red;
case Red: return Green;
case Green: return White;
default: throw new RuntimeException("No next mana cost type for " + this);
}
}
public MagicCostManaType prev() {
switch (this) {
case White: return Green;
case Blue: return White;
case Black: return Blue;
case Red: return Black;
case Green: return Red;
default: throw new RuntimeException("No next mana cost type for " + this);
}
}
public String getName() {
return name;
}
public String getText() {
return text;
}
public List<MagicManaType> getTypes() {
return types;
}
public MagicManaType[] getTypes(final MagicDeckProfile profile) {
int count=0;
final MagicManaType[] profileTypes=new MagicManaType[types.size()];
for (final MagicManaType manaType : types) {
if (profile.allowsManaType(manaType)) {
profileTypes[count++]=manaType;
}
}
return Arrays.copyOf(profileTypes,count);
}
}