//----------------------------------------------------------
// Template code for CISC181, fall 2011
// by Christopher Rasmussen
// University of Delaware
// v. 1.0
//----------------------------------------------------------

package cards;

//----------------------------------------------------------

public class Card implements Comparable<Card> {

	static final int NUM_CARDS_IN_DECK = 52;
	static final int NUM_RANKS = 13;
	static final int NUM_SUITS = 4;
	
	static final int DIAMONDS = 0;
	static final int CLUBS = 1;
	static final int HEARTS = 2;
	static final int SPADES = 3;
	
	static String[] RankString = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" };
	static String[] SuitString = { "Diamonds", "Clubs", "Hearts", "Spades" };
	
	static String[] ShortRankString = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
	static String[] ShortSuitString = { "\u2662", "\u2663", "\u2661", "\u2666" };

	int rank_index, suit_index;
	
	boolean printShort = true;
	boolean sortByRankFirst = true;
	
	// initialize rank, suit *from* index in [0, 51]
	
	Card(int index)
	{
		rank_index = index % NUM_RANKS;
		suit_index = index / NUM_RANKS;
	}
	
	// what color is the card?
	
	boolean is_red()
	{
		return (suit_index == HEARTS || suit_index == DIAMONDS);
	}
	
	// needed for sorting: -1 mean this card is "less" than c, +1 means "greater", 0 means "equal"
	
	public int compareTo(Card c) 
	{
		// rank is most important
		
		if (sortByRankFirst) {
			if (rank_index == c.rank_index) {
				if (suit_index < c.suit_index)
					return -1;
				else if (suit_index == c.suit_index)
					return 0;
				else
					return 1;
			}
			else if (rank_index < c.rank_index)
				return -1;
			else 
				return 1;	
		}
		
		// suit is most important
		
		else {
			if (suit_index == c.suit_index) {
				if (rank_index < c.rank_index)
					return -1;
				else if (rank_index == c.rank_index)
					return 0;
				else
					return 1;
			}
			else if (suit_index < c.suit_index)
				return -1;
			else 
				return 1;	
		}
	}
	
	// render card rank, suit in printable form
	
	public String toString()
	{
		if (printShort)
			return (ShortRankString[rank_index] + ShortSuitString[suit_index]);
		else
			return (RankString[rank_index] + " of " + SuitString[suit_index]);
	}
}

//----------------------------------------------------------
//----------------------------------------------------------
