#include <qapplication.h>
#include <qpushbutton.h>
#include <qsizepolicy.h>
#include <qpainter.h>
#include <qpixmap.h>

#include <cassert>
#include <string>

#include "Tile.h"


using std::string;



	//********************************************************************************/
	//	Method Definitions for Tile Class
	//********************************************************************************/
	//********************************************************************************/


	//-------------------------------------------------------------------------------
	//	Constructors that take the letters ID number or its char **must be capitalized**
	//-------------------------------------------------------------------------------
	Tile::Tile(int LetterNum, QWidget* parent, const char* name)
		: QPushButton( parent, name)
	{

		assert (LetterNum > -1 && LetterNum < 26 );

		setMinimumSize(20, 20);
		setMaximumSize(45, 45);

		LetterID = LetterNum;

		Value = LetterIDValue[LetterID];
		
		Letter = static_cast<char>(LetterID + 65);

		char LetterString[]= { Letter, '\0' };

		setText( LetterString );
		setFont( QFont( "Times", 16, QFont::Bold ) );
		
	}

	//********************************************************************************/
	Tile::Tile(char LetterChar, QWidget* parent, const char* name)
		: QPushButton(parent, name)
	{

		assert ( (LetterChar >= 'A' && LetterChar <= 'Z') || LetterChar == ' ');

		setMinimumSize(20, 20);
		setMaximumSize(45, 45);


		Letter = LetterChar;

		char LetterString[]= { Letter, '\0' };


		LetterID = static_cast<int>(LetterChar) - 65;

		Value = LetterIDValue[LetterID];

		setText( LetterString );
		setFont( QFont( "Times", 16, QFont::Bold ) );

	}

	//-------------------------------------------------------------------------------
	//	Copy Constructor
	//-------------------------------------------------------------------------------
	Tile::Tile(const Tile& TileToCopy, QWidget* parent, const char* name)
		: QPushButton(parent, name)
	{	

		setMinimumSize(20, 20);
		setMaximumSize(45, 45);

		LetterID = TileToCopy.letterID();
		Value = TileToCopy.value();
		Letter = TileToCopy.letter();

		char LetterString[]= { Letter, '\0' };

		setText( LetterString );
		setFont( QFont( "Times", 16, QFont::Bold ) );

	}


	//********************************************************************************/
	//	Purpsose:	resize font to fit tile size
	//********************************************************************************/
	void Tile::resizeEvent(QResizeEvent* e)
	{

		//make font at most 2/3 of the width or height
		int FontSize= e->size().width()<e->size().height()? e->size().width()*2/3 :
				e->size().height()*2/3;
		
		char LetterString[]= { Letter, '\0' };

		setFont(QFont( "Times", FontSize, QFont::Bold));
	}

	//********************************************************************************/
	//	Purpose:	paint letter and value on tile
	//********************************************************************************/
	void Tile::paintEvent(QPaintEvent* e)
	{
		int width = e->rect().size().width();
		int FontSize = width/4;

		//the letter
		char LetterString[]= { Letter, '\0' };
		QString label = LetterString;

		//the value
		QString number;
		number.setNum(Value);
		
		//paint it in the right place
		QPainter p(this);
		p.drawText( 0, 35, label);
		p.setFont(QFont("Times", FontSize, QFont::Bold));
		p.drawText( width-FontSize-4, width-FontSize+3, number);
	}


	//********************************************************************************/
	//	Purpose: set tile TileToCopy
	//********************************************************************************/
	void Tile::SetToDifferent(const Tile& TileToCopy)
	{
		if ( LetterID == TileToCopy.letterID() )
			return;

		LetterID = TileToCopy.letterID();
		Value = TileToCopy.value();
		Letter = TileToCopy.letter();

		char LetterString[] = { Letter, '\0' };
		setText( LetterString );

	}

	//-------------------------------------------------------------------------------
	//	returns char of Tile (capital letter)
	//-------------------------------------------------------------------------------
	char Tile::letter() const
	{
		return Letter;
	}

	//-------------------------------------------------------------------------------
	//	returns number representing letter on Tile
	//-------------------------------------------------------------------------------
	int Tile::letterID() const
	{
		return LetterID;
	}

	//-------------------------------------------------------------------------------
	//	returns point value of Tile
	//-------------------------------------------------------------------------------
	int Tile::value() const
	{
		return Value;
	}
