#ifndef LUA_HPP
#define LUA_HPP

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

// Standard
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// C++
#include <string>
#include <vector>
#include <iostream>


namespace USpeedGameEngine
{


class Lua
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :
        void *state;    //!< État pour l'exécution de Lua.
        bool loaded;    //!< État du chargement d'un script.

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur par défaut.
        Lua();
        // Destructeur par défaut.
        ~Lua();

        //////////////////
        // Début et fin //
        //////////////////
        // Préparation de l'interprêteur.
        bool prepare();
        // Libération de l'interprêteur.
        void finish();

        ///////////
        // États //
        ///////////
        // État du chargement d'un script.
        bool isLoaded();
        // État de la machine Lua.
        bool isReady();

        ///////////////////////////////
        // Chargement et paramétrage //
        ///////////////////////////////
        // Ajout d'une fonction "C" disponible dans le script Lua.
        bool addFunction(std::string const &fctName, int(*theFct)(void *aState));
        // Ajout d'une fonction "C" disponible dans le script Lua incluse dans un éventuel groupe.<br />
        bool addFunction(std::string const &group, std::string const &fctName, int(*theFct)(void *aState));
        // Chargement du script depuis un fichier.
        bool load(const char *filename);
        // Chargement du script depuis un tampon mémoire.
        bool loadFromBuffer(const char *script);
        // Exécution script préalablement chargé.
        bool run();

        //////////////////////////
        // Accès aux paramètres //
        //////////////////////////
        // Retourne le nombre de paramètres passés à la fonction "C".
        static unsigned int getParametersCount(void *state);
        // Retourne le paramètre spécifié sous forme de chaîne de caractères (si possible).
        static void getString(void *state, unsigned int index, std::string &target);
        // Retourne le paramètre spécifié sous forme de nombre (si possible).
        static double getNumber(void *state, unsigned int index);
        // Retourne le paramètre spécifié sous forme de bouléen (si possible).
        static bool getBool(void *state, unsigned int index);
        // Retourne le paramètre spécifié sous forme de pointeur (si possible).
        static const void *getPointer(void *state, unsigned int index);

        ////////////////////////////////
        // Ajout de données de retour //
        ////////////////////////////////
        // Ajoute la variable spécifiée sous forme de chaîne de caractères.
        static bool returnString(void *state, std::string const &str);
        // Ajoute la variable spécifiée sous forme de nombre.
        static bool returnNumber(void *state, double nbr);
        // Ajoute la variable spécifiée sous forme de bouléen.
        static bool returnBool(void *state, bool aBool);
        // Ajoute la variable spécifiée sous forme de pointeur.
        static bool returnPointer(void *state, void *ptr);
        // Ajoute la variable spécifiée sous forme de tableau de chaînes de caractères.
        static bool returnTable(void *state, std::vector<std::string> const &table);

    protected :
    private :
};

}        // Fin "namespace USpeedGameEngine"

#endif
