//Name: David Yang, Sean McMillan, Dominic Golab
//File: Bag.cpp
//For: CSE 30331: Scrabble Gmae
//12/6/09
/*Description: This file contains the functionality of the bag class.
The bag class holds the tiles that have yet to be used. It shuffles a vector of letters adn then puts them into a queue*/


#include "Bag.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "Tile.h"
#include <algorithm>
#include <iostream>

using namespace std;

//constructor
Bag :: Bag(){

  setLettersAndValues();//sets the letters and values into the vector of tiles
  shuffle();//shuffles the vector
  for(int i=0;i<letters.size();i++){//pushes the vector of tiles into the queue of tiles
    letterBag.push(letters[i]);
  }
}


//this function draws a letter from the bag
Tile Bag :: draw(){

  Tile letter;
  letter = letterBag.front();//sets the tile to the front of the bag
  letterBag.pop();//pops the bag
  return letter;//returns the tile

}


//shuffling the bag
void Bag :: shuffle(){
  srand ( unsigned ( time (NULL) ) );//seeds the randome number generator
  random_shuffle (letters.begin(),letters.end());//shuffles the vector of tiles
}

//checks if the bag is empty
bool Bag :: isEmpty(){

  if(letterBag.empty()==true){//if bag is empty return true
    return true;
  }
  else{//else return false
    return false;
  }
}

//places the letters back into the bag when a player chooses to exchange
void Bag :: exchange (Tile letter){

  letterBag.push(letter);//pushes tile to the back of the queue

}


//enters the letters and values needed into the bag for the game
void Bag :: setLettersAndValues(){
  Tile letter;

  letter.setLetter('A',1);//puts in 9 A's

  for(int i=0;i<9;i++){
    letters.push_back(letter);
  }

  letter.setLetter('E',1);//puts in 12 E's

  for(int i=0;i<12;i++){
    letters.push_back(letter);
  }

  letter.setLetter('I',1);//puts in 9 I's

  for(int i=0;i<9;i++){
    letters.push_back(letter);
  }

  letter.setLetter('O',1);//puts in 8 O's

  for(int i=0;i<8;i++){
    letters.push_back(letter);
  }

  letter.setLetter('N',1);//puts in 6 N's

  for(int i=0;i<6;i++){
    letters.push_back(letter);
  }

  letter.setLetter('R',1);//puts in 6 R's

  for(int i=0;i<6;i++){
    letters.push_back(letter);
  }

  letter.setLetter('S',1);//puts in 4 S's

  for(int i=0;i<4;i++){
    letters.push_back(letter);
  }

  letter.setLetter('L',1);//puts in 4 L's

  for(int i=0;i<4;i++){
    letters.push_back(letter);
  }

  letter.setLetter('T',1);//puts in 6 T's

  for(int i=0;i<6;i++){
    letters.push_back(letter);
  }

  letter.setLetter('U',1);//puts in 4 U's

  for(int i=0;i<4;i++){
    letters.push_back(letter);
  }

  letter.setLetter('K',5);//puts in 1 K

  letters.push_back(letter);

  letter.setLetter('M',3);//puts in 2 M's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('D',2);//puts in 4 D's

  for(int i=0;i<4;i++){
    letters.push_back(letter);
  }

  letter.setLetter('P',3);//puts in 2 P's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('F',4);//puts in 2 F's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('G',2);//puts in 3 G's

  for(int i=0;i<3;i++){
    letters.push_back(letter);
  }

  letter.setLetter('B',3);//puts in 2 B's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('C',3);//puts in 2 C's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('H',4);//puts in 2 H's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('V',4);//puts in 2 V's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('W',4);//puts in 2 W's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('Y',4);//puts in 2 Y's

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }

  letter.setLetter('J',8);//puts in 1 J

  letters.push_back(letter);

  letter.setLetter('X',8);//puts in 1 X

  letters.push_back(letter);

  letter.setLetter('Q',10);//puts in 1 Q

  letters.push_back(letter);

  letter.setLetter('Z',10);//puts in 1 Z

  letters.push_back(letter);

  letter.setLetter('+',0);//puts in 2 blank tiles

  for(int i=0;i<2;i++){
    letters.push_back(letter);
  }



}


//returns value of letter
int Bag :: letterValue(char alpha){//returns the value of each letter
  int value;
  if(alpha=='A' || alpha=='E' || alpha=='I' || alpha=='O' || alpha=='N' || alpha=='R' || alpha=='S' || alpha=='L' || alpha =='T' || alpha=='U'){
    value = 1;
  }
  else if(alpha=='K'){
    value = 5;
  }
  else if(alpha=='M' || alpha=='P' || alpha=='B' || alpha=='C'){
    value = 3;
  }
   else if(alpha=='D' || alpha=='G'){
     value = 2;
  } 
  else if(alpha=='F' || alpha=='H' || alpha=='V' || alpha=='W' || alpha=='Y'){
    value=4;
  } 
  else if(alpha=='J' || alpha=='X'){
    value=8;
  } 
  else if(alpha=='Q' || alpha=='Z'){
    value = 10;
  } 
  else{
    value=0;
  }

  return value;

}
