#ifndef CORE_HPP
#define CORE_HPP

// Détection du système cible...
#include "usgeDetectSystem.h"

#ifdef TARGET_SYSTEM_PSP
#elif defined TARGET_SYSTEM_WIN32
    #include <windows.h>
#endif

#include "Core/CoreTypes.hpp"

// Standard
#include <time.h>

// C++
#include <string>

namespace USpeedGameEngine
{

class Core
{
    /****************
    * Les attributs *
    ****************/
    public :
        // Systèmes cibles.
        static const unsigned int systemUnk;          //!< Code pour un système inconnu
        static const unsigned int systemPSP;          //!< Code pour un système PlayStation Portable
        static const unsigned int systemWin32;        //!< Code pour un système Windows

    protected :
    private :

    /***************
    * Les méthodes *
    ***************/
    public :
        // Destructeur par défaut
        ~Core();
        // Fonction principale à lancer
        int run
        (
            int argNumber,
            char *argList[],
            void (*customInit)(void),
            void (*customMain)(unsigned long int),
            void (*customFinish)(void),
            USGE_RenderEngine renderEngine
        );
        // Retourne l'instance unique du "Core"
        static Core *getInstance();
        // Retourne les informations sur le moteur de jeu
        static const char *getEngineInfos();
        // Mise en pause de l'application ou du thread courant.
        static void doSleep(unsigned long int ms);

        // Fonction permettant de quitter la boucle principale
        void endMain();
        // Affiche une zone de saisie pour que l'utilisateur entre du texte
        std::string getUserInput(unsigned int textMaxLen, std::string const &defaultText);
        std::string getUserInput(unsigned int textMaxLen, std::string const &defaultText, std::string const &comment);
        std::string getUserInput(unsigned int textMaxLen, std::string const &defaultText, std::string const &comment, std::string const &okLabel, std::string const &cancelLabel);
        // Permet de définir la fonction à appeler lors de la mise en veille du programme
        void setSuspendFunction(void (*suspendFct)(bool));
        // Affichage d'une boîte de message avec possibilitée de demander "Oui"/"Non"
        bool messageBox(const char *title, const char *text, bool askYesNo);
        void messageBox(const char *title, const char *text);
        bool messageBox(std::string const &title, std::string const &text, bool askYesNo);
        void messageBox(std::string const &title, std::string const &text);
        // Retourne le nombre de paramètres passés au programme (via le main)
        unsigned int getMainVarCount();
        // Retourne les paramètres passés au programme (via le main) ou le pointeur nul
        const char *getMainVars(unsigned int myIndex);
        // Retourne le chemin complet de l'application (avec le "/" à la fin)
        std::string getAppFolder();
        // Retourne la plateforme puor laquelle est destinée le programme.
        unsigned int getTargetSystem();
        // Retourne le titre de l'application.
        const char *getApplicationTitle();
        // Permet de définir le titre de l'application.
        void setApplicationTitle(const char *title);
        // Permet de définir le nombre d'images par seconde désiré.
        void setFPS(unsigned int fps);
        // Permet de connaître à combien d'images par seconde le moteur est paramétré.
        unsigned int getFPS();
        // Passage de l'application en mode plein écran.
        void toFullscreen();
        // Passage de l'application en mode fenêtré.
        void toWindowed();
        // Demande de création d'un thread par l'utilisateur.
        int createThread(bool (*functionToRun)(int));

    protected :
    private :
        // Constructeur par défaut
        Core();
        // Fonction de finalisation
        void finish();
};

}        // Fin "namespace USpeedGameEngine"

#endif
