/***********************************************************
 * God Mode On, Und[0]ne Devs < http://undonedevs.tk >
 * 2013 Pepe Romero < wizardpepe@gmail.com >
 * < https://bitbucket.org/undone_devs/god-mode-on >
 ***********************************************************/

#ifndef GameManager_H
#define GameManager_H

#include <stack>
#include <Ogre.h>
#include <OgreSingleton.h>
#include <OIS.h>

#include "InputManager.h"

class GameState;

class GameManager : public Ogre::FrameListener, public Ogre::Singleton<GameManager>, public OIS::KeyListener, public OIS::MouseListener
{

public:
    GameManager ();
    ~GameManager (); // Limpieza de todos los estados.

    // Para el estado inicial.
    void start (GameState* state);

    // Funcionalidad para transiciones de estados.
    void changeState (GameState* state);
    void pushState (GameState* state);
    void popState ();

    // Heredados de Ogre::Singleton.
    static GameManager& getSingleton ();
    static GameManager* getSingletonPtr ();

protected:
    Ogre::Root* _root;
    Ogre::SceneManager* _sceneManager;
    Ogre::RenderWindow* _renderWindow;

    // Funciones de configuración.
    void loadResources ();
    bool configure ();

    // Heredados de FrameListener.
    bool frameStarted (const Ogre::FrameEvent& evt);
    bool frameEnded (const Ogre::FrameEvent& evt);

private:
    // Funciones para delegar eventos input en el estado actual.
    bool keyPressed (const OIS::KeyEvent &e);
    bool keyReleased (const OIS::KeyEvent &e);
    bool mouseMoved (const OIS::MouseEvent &e);
    bool mousePressed (const OIS::MouseEvent &e, OIS::MouseButtonID id);
    bool mouseReleased (const OIS::MouseEvent &e, OIS::MouseButtonID id);

    // Gestor de eventos input.
    InputManager *_inputMgr;

    // Pila de estados del juego.
    std::stack<GameState*> _states;
};

#endif
