package A3;

import java.util.ArrayList;

public class StandardDeckImpl implements Deck {

	private ArrayList cards = new ArrayList();
	private ArrayList cardsOriginal = new ArrayList();
	
	public StandardDeckImpl(){
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.CLUBS,i,this));
		}
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.SPADES,i,this));
		}
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.HEARTS,i,this));
		}
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.DIAMONDS,i,this));
		}
	cardsOriginal=(ArrayList<Card>)cards.clone();
	}
	
	@Override
	public int getSize() {
		// TODO Auto-generated method stub
		return cards.size();
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		if(cards.size()==0){
			return true;
		}else{
		return false;
		}
	}

	@Override
	public Card getTop() {
		// TODO Auto-generated method stub
		if(cards.isEmpty()){
			throw new RuntimeException("Deck is empty");
		}
		return (Card) cards.get(0);
	}

	@Override
	public Card takeTop() {
		// TODO Auto-generated method stub
		if(cards.isEmpty()){
			throw new RuntimeException("Deck is empty");
		}
		Card topCard = getTop();
		cards.remove(0);
		return topCard;
	}

	@Override
	public void placeOnTop(Card c) {
		// TODO Auto-generated method stub
		if(!c.getDeck().equals(this)){
			throw new RuntimeException("This card does not belong to this deck");
		}
		cards.add(0, c);
	}

	@Override
	public void cut(int position) {
		// TODO Auto-generated method stub
		if(position<1||position>cards.size()){
			
		}else{
			for(int i=0;i<getSize()-position;i++){
				rotate();
			}
		}
	}

	@Override
	public void rotate() {
		// TODO Auto-generated method stub
		Card cardAtTop=takeTop();
		cards.add(cardAtTop);
	}

	@Override
	public DeckIterator iterator() {
		// TODO Auto-generated method stub
		return new DeckIteratorNoFace(this);
	}

	@Override
	public DeckIterator faceUpIterator() {
		// TODO Auto-generated method stub
		return new DeckIteratorFaceUp(this);
	}

	@Override
	public DeckIterator faceDownIterator() {
		// TODO Auto-generated method stub
		return new DeckIteratorFaceDown(this);
	}

	@Override
	public void reset() {
		// TODO Auto-generated method stub
		cards.clear();
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.CLUBS,i,this));
		}
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.SPADES,i,this));
		}
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.HEARTS,i,this));
		}
		for(int i=1;i<14;i++){
			cards.add(new StandardCardImpl(StandardCard.Suit.DIAMONDS,i,this));
		}
		
	}

}
