import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Card implements Comparable<Card> {
    private final Rank rank;
    private final Suit suit;

    public Card(Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public Suit getSuit() {
        return suit;
    }

    public Rank getRank() {
        return rank;
    }

    public String toString() {
        return rank + " of " + suit;
    }
    
    public int compareTo(Card c) {
    	int s = suit.compareTo(c.getSuit());
    	if (s==0) return rank.compareTo(c.getRank());
    	else return s;
    }
    
    public static List<Card> newDeck() {
    	List<Card> l = new ArrayList<Card>();
    	for (Rank r: Rank.values())
        	for (Suit s: Suit.values())
        		l.add(new Card(r,s));
    	return l;        		
    }
    
    public static Iterator<Card> reverseIterator(List<Card> deck)
    {
  		return new ReverseIterator<Card>(deck);
    }    
    public static Iterator<Card> shuffleIterator(List<Card> deck)
    {
  		return new ShuffleIterator<Card>(deck);
    }
}

