#include <algorithm>
#include <random>
#include <ctime>
#include "Deck.h"

Deck Deck::deck(6);

Deck::Deck(size_t _num_decks) : Deck(_num_decks, 0) {}

Deck::Deck(size_t _num_decks, size_t _seed)
  : num_decks(_num_decks), seed(_seed) {
    cards.reserve(num_decks * 52);
    reset();
  }

void Deck::reset() {
  cards.clear();
  for(size_t d = 0; d < 4 * num_decks; ++d) {
    // Add 2 through 9
    for(int v = 2; v <= 9; ++v) {
      cards.push_back(v);
    }
    // Add 4 tens
    for(int t = 0; t < 4; ++t) {
      cards.push_back(10);
    }
    cards.push_back(11);
  }
  shuffle(cards.begin(), cards.end(), std::default_random_engine(seed ? seed : time(0)));
}

bool Deck::shouldReset() {
  size_t size = 52 * num_decks;
  return size / cards.size() >= 4;
}

Card Deck::getCard() {
  Card ret = cards.back();
  cards.pop_back();
  return ret;
}

double Deck::getRemainingDecks() {
  return cards.size() / double(52);
}