#ifndef TOOLS_HPP
#define TOOLS_HPP

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

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


namespace USpeedGameEngine
{

class Tools
{
    /****************
    * Les attributs *
    ****************/
    public :
    protected :
    private :

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

        /////////////////////////////
        // Travail sur les chaînes //
        /////////////////////////////
        // Découpe la chaîne au séparateur spécifié
        static void splitString(std::string const &myString, std::string const &separator, std::vector<std::string> &target);
        // Remplace une chaîne par une autre dans la chaîne fournie
        static void replaceString(std::string const &myString, std::string const &from, std::string const &to, std::string &target);
        static void replaceString(std::string &myString, std::string const &from, std::string const &to);
        // Convertit la chaîne en minuscules
        static void stringToLower(std::string &myString);
        // Convertit la chaîne en majuscules
        static void stringToUpper(std::string &myString);
        // Retire tous les accents des lettres (majuscules et minuscules)
        static void stringAlphaOnly(std::string &myString);

        /////////////
        // Base 64 //
        /////////////
        // Encode les données spécifiées en base 64
        static bool toBase64(std::string const &toEncode, std::string &target);
        static bool toBase64(std::string &toEncode);
        // Décode les données spécifiées depuis la base 64
        static bool fromBase64(std::string const &toDecode, std::string &target);
        static bool fromBase64(std::string &toDecode);
        // Transforme le nombre spécifié de la base 10 à la base 64
        static void numberToBase64(unsigned long int number, std::string &target);
        // Transforme le nombre spécifié de la base 64 à la base 10
        static unsigned long int numberFromBase64(std::string const &number);

        /////////////////////
        // Compression Zip //
        /////////////////////
        // Compresser les données spécifiées vers le tampon spécifié
        static bool zip(std::string const &toCompress, std::string &compressed);
        static bool zip(std::string &toCompress);
        // Décompresser les données spécifiées vers le tampon spécifié avec un tampon de taille par défaut mis à 500Ko
        static bool unzip(std::string const &toUncompress, std::string &uncompressed);
        static bool unzip(std::string &toUncompress);

        ////////////////////////////////
        // Cryptage et décryptage AES //
        ////////////////////////////////
        static bool toAES(std::string const &toCrypt, std::string const &key, std::string &target);
        static bool toAES(std::string &toCrypt, std::string const &key);
        static bool fromAES(std::string const &toDecrypt, std::string const &key, std::string &target);
        static bool fromAES(std::string &toDecrypt, std::string const &key);

        ////////////////
        // Format INI //
        ////////////////
        // Lecture du fichier INI (sous forme de chaîne) vers un tableau de données (donnees[cle] = valeur)
        static void tableFromIni(std::string const &iniInfos, std::map<std::string, std::string> &target);
        // Retourne une chaîne structurée comme un fichier INI depuis un tableau de données (table[cle] = valeur)
        static void iniFromTable(std::map<std::string, std::string> &table, std::string &target);
        // Convertie la chaîne spécifiée au format nécéssaire pour les fichiers INI du système
        static void stringToIniFormat(std::string const &myString, std::string &target);
        static void stringToIniFormat(std::string &myString);
        // Convertie la chaîne spécifiée depuis le format nécéssaire pour les fichiers INI du système vers le format initial
        static void stringFromIniFormat(std::string const &myString, std::string &target);
        static void stringFromIniFormat(std::string &myString);

        ////////////
        // Autres //
        ////////////
        // Récupère la partie suivante du fichier spécifié
        static bool nextPartOfFile(FILE *file, std::string &buffer, unsigned long int &fileSize);
        // Encode les données spécifiées en md5
        static bool md5(std::string const &toEncode, std::string &target, bool shortMD5);
        static bool md5(std::string &toEncode, bool shortMD5);
        // Calcul de la signature SHA-256 des données fournies vers le tampon spécifié.
        static void sha256(std::string const &toHash, std::string &target);
        // Calcul de la signature SHA-512 des données fournies vers le tampon spécifié.
        static void sha512(std::string const &toHash, std::string &target);
        // Calcul de la signature CRC-32 (Cyclic Redundance Check) : Contrôle de Redondance Cyclique sur 32 bits.
        static unsigned long int crc32(std::string const &data);
        // Convertit le tableau d'octets en hexadécimal
        static bool toHexa(std::string const &toEncode, std::string &target);
        static bool toHexa(std::string &toEncode);
        // Convertit le tableau d'octets en hexadécimal en valeur numérique.
        static unsigned long int fromHexa(std::string const &toDecode);

    protected :
    private :
        // Constructeur par défaut
        Tools();
};

}        // Fin "namespace USpeedGameEngine"

#endif
