#ifndef INIFILE_HPP
#define INIFILE_HPP

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

// C++
#include <string>
#include <vector>


namespace USpeedGameEngine
{

class IniFile
{
    /****************
    * Les attributs *
    ****************/
    public :
        /**
         * Structure de stockage des informations des couples (clé/valeur)
         */
        struct IniCouple
        {
            std::string key;        //!< La clé d'ientification
            std::string value;      //!< La valeur
        };

        /**
         * Structure de stockage des informations des couples (clé/valeur) issue d'un fichier INI pour une section
         */
        struct IniSection
        {
            std::string sectionName;                        //!< Le nom de la section
            std::vector<struct IniCouple *> couples;        //!< Les couples associés à la section
        };

    protected :
    private :
        std::vector<struct IniSection *> iniValues;         //!< Les valeurs du fichier INI

    /***************
    * Les méthodes *
    ***************/
    public :
        // Constructeur de la classe
        IniFile();
        // Destructeur de la classe
        ~IniFile();
        // Charge le fichier INI spécifié
        bool load(const char *filename);
        // Charge les données INI spécifiées
        bool loadFromBuffer(std::string const &data);
        // Retourne la valeur pour la clé et la section spécifiée
        std::string getValue(const char *section, const char *key, const char *defaultValue);
        std::string getValue(std::string const &section, std::string const &key, std::string const &defaultValue);
        void getValue(const char *key, const char *defaultValue, std::string &target);
        void getValue(const char *section, const char *key, const char *defaultValue, std::string &target);
        // Permet de savoir si il y a des données ou pas
        bool isEmpty();
        // Efface tout
        void reset();
    protected :
    private :
        // Fonction qui recherche la section donnée (ou la crée) et y ajoute le couple clé/valeur
        void loadValue(std::string const &section, std::string const &key, std::string const &value);
};

}        // Fin "namespace USpeedGameEngine"

#endif
