
#ifndef H_deckOfCards
#define H_deckOfCards
#include "card.h"
#include <cstdlib>
#include <ctime>
#include <iomanip>

using namespace std;

const int CARDS_PER_DECK = 52;


class deckOfCards {
public:
	deckOfCards();
	void shuffle();
	card dealCard();
	void printDeck() const;
private:
	card * deck;
	int currentCard;
};

void deckOfCards::printDeck() const {
	cout << left;
	for (int i = 0; i < CARDS_PER_DECK; i++) {
		cout << setw(19) << deck[i].print();
		if ((i + 1) % 4 == 0) cout << endl;
	}
}

deckOfCards::deckOfCards() {  //use of array is appropriate since size won't change
	string ranks[] = { "Ace", "Deuce", "Trey", "Four", "Five", "Six", "Seven", 	"Eight", "Nine", "Ten", "Jack", "Queen", "King" };
	string suits[] = { "Clubs", "Diamonds", "Hearts", "Spades" };
	deck = new card[CARDS_PER_DECK];
	currentCard = 0;
	for (int count = 0; count < CARDS_PER_DECK; count++)  //populate the deck in order
		deck[count] = card(ranks[count % 13], suits[count / 13]);
}

void deckOfCards::shuffle() {
	srand((unsigned)time(0));
	for (int i = 0; i < CARDS_PER_DECK - 1; ++i) {
		swap(deck[i], deck[i + 1 + rand() % (CARDS_PER_DECK - i - 1)]);
	}
} 

card deckOfCards::dealCard() {
	if (currentCard>CARDS_PER_DECK)
		shuffle();
	if (currentCard < CARDS_PER_DECK)
		return (deck[currentCard++]);
	return (deck[0]);
}

#endif