#include "TileBank.h"
#include "Tile.h"
#include "random.h"

	//********************************************************************************/
	//	Method Definitions for Tile Class
	//********************************************************************************/
	//********************************************************************************/


#include <iostream>
using std::cout;
//----------------------------------------------------------------------------------------------------
//						Constructor - like filling bag up
//----------------------------------------------------------------------------------------------------
TileBank::TileBank(QWidget* parent, const char* name) : QWidget(parent, name)
{	
		
	for (int i = 0; i < 26; i++)
	{
		NoOfLetters[i] = max_of_letter[i];
	}

	tiles_remaining = 98;
}


//----------------------------------------------------------------------------------------------------
//	reset Tile Bank to initial values
//----------------------------------------------------------------------------------------------------
void TileBank::reset()
{
	for (int i = 0; i < 26; i++)
	{
		NoOfLetters[i] = max_of_letter[i];
	}

	tiles_remaining = 98;
}



//----------------------------------------------------------------------------------------------------
//	    addTile - return tile to the bag
//		precondition ... bag doesn't end up with more than max number of tiles of that letter
//----------------------------------------------------------------------------------------------------
void TileBank::addTile(Tile* NewTile)
{	
	tiles_remaining ++;
	NoOfLetters[NewTile ->letterID()]++;
	assert (NoOfLetters[NewTile ->letterID()] <= max_of_letter[NewTile ->letterID()]);
}

//----------------------------------------------------------------------------------------------------
//	    isEmpty - return true if there are no more tiles in the bag
//----------------------------------------------------------------------------------------------------
bool TileBank::isEmpty() const
{	
	return (tiles_remaining == 0);
}

//----------------------------------------------------------------------------------------------------
//	    TilesLeft tells how many tiles are still in the bag
//----------------------------------------------------------------------------------------------------
int TileBank::TilesLeft() const
{
	return (tiles_remaining);
}


void TileBank::dealTile()
{
	

	if (tiles_remaining == 0) {return;}

	int r;

	if (tiles_remaining == 1) r = 1;
	else  r = random(1,tiles_remaining); 
	//note: cannot go 1 to 26 then just subtract because there should be a greater probabililty of
	// pulling a letter like A with more representative tiles than a letter like Z with only one

	for (int i = 0; i < 26; i++)
	{	
		r -= NoOfLetters[i];
		if (r<=0)
		{	
			tiles_remaining--;
			NoOfLetters[i]--;
			emit returnTile( i );
			break;
		}
	}


}
