/*
  QSoloCards is a collection of Solitaire card games written using Qt
  Copyright (C) 2009  Steve Moore

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "GameMgr.h"
#include "SpiderBoard.h"
#include "Spider3DeckBoard.h"
#include "SpideretteBoard.h"
#include "KlondikeBoard.h"
#include "FreeCellBoard.h"
#include "YukonBoard.h"
#include <QtGui/QActionGroup>

///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
GameMgr::GameMgr()
    :m_lastGameId(GameMgr::NoGame)
{
    // build the list of games
    m_gameDspNameList<<QObject::tr("Spider").trimmed()
		     <<QObject::tr("Klondike").trimmed()
		     <<QObject::tr("Freecell").trimmed()
		     <<QObject::tr("Three Deck Spider").trimmed()
		     <<QObject::tr("Spiderette").trimmed()
		     <<QObject::tr("Yukon").trimmed();
}

///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
GameMgr::~GameMgr()
{
}

///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
void GameMgr::buildGameListMenu(QMenu & menu) const
{
    QActionGroup * pGameGroup=new QActionGroup(&menu);

    for (int i=0;i<GameMgr::NoGame;i++)
    {
        QAction * pCurrAction=new QAction(this->m_gameDspNameList.at(i),pGameGroup);
        pCurrAction->setData(QVariant(i));
	pCurrAction->setCheckable(true);
	if (i==this->m_lastGameId)
	{
	    pCurrAction->setChecked(true);
	}
        menu.addAction(pCurrAction);
    }
}

///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
GameBoard * GameMgr::getGame(GameId gameId)
{
    GameBoard * pGame=NULL;

    switch(gameId)
    {
    case GameMgr::Spider:
	pGame=new SpiderBoard(NULL);
        break;
    case GameMgr::Klondike:
	pGame=new KlondikeBoard(NULL);
        break;
    case GameMgr::FreeCell:
	pGame=new FreeCellBoard;
        break;
    case GameMgr::ThreeDeckSpider:
	pGame=new Spider3DeckBoard;
        break;
    case GameMgr::Spiderette:
	pGame=new SpideretteBoard;
        break;
    case GameMgr::Yukon:
	pGame=new YukonBoard;
        break;
    case GameMgr::NoGame:
    default:
	pGame=NULL;
        break;
    };

    // if we were able to create a valid game board.  Set the last
    // game id
    if (NULL!=pGame)
    {
        this->m_lastGameId=gameId;
    }

    return pGame;
}