#ifndef RES_READER_HPP
#define RES_READER_HPP

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

#include <stdio.h>
#include <string>
#include <vector>

namespace USpeedGameEngine
{

class ResReader
{
    // Les variables
    public:
    protected:
    private:
        /**
         * Structure de stockage d'une information de l'index
         */
        struct IndexEntry
        {
            std::string key;                            //!< La clé de la donnée
            unsigned int position;                      //!< La position de la donnée
            unsigned int length;                        //!< La longueur de la donnée
            unsigned int blocks;                        //!< Le nombre de blocs de la donnée (pas plus de 65535)
            unsigned int blocks_x2;                     //!< Le nombre de blocs de la donnée (pas plus de 65535) x2 pour le nombre d'octets
            unsigned int blocksPos;                     //!< Position de la liste des tailles de blocs de la donnée (à la fin de la donnée)
            std::string blockSizeList;                  //!< La liste des tailles de blocs
        };
        FILE *file;                                     //!< Le fichier de ressources en cours de lecture ou pointeur nul
        std::vector<struct IndexEntry> index;           //!< L'index des ressources
        std::string password;                           //!< Le mot de passe de décryptage (ou vide si pas de mot de passe)
        unsigned int blockSize;                         //!< La taille d'un bloc de données brutes (entre 1Ko et 50Ko). Taille par défaut : 4Ko
        char *readBuffer;                               //!< Le tampon de lecture

    // Les fonctions
    public:
        // Constructeur par défaut
        ResReader();
        // Destructeur par défaut
        ~ResReader();
        // Ouvre le fichier spécifié et charge l'index
        bool open(std::string const &filename, std::string const &pwd);
        bool open(std::string const &filename);
        // Ferme le fichier ouvert
        void close();

        // Charge la ressource ou la partie de ressource demandée
        bool load(std::string const &key, std::string &value);
        // Charge le segment de ressource demandé
        bool loadPart(std::string const &key, std::string &value, unsigned int partToRead);
        bool loadPart(std::string const &key, std::string &value, unsigned int seekPosition, unsigned int sizeToRead);
        // Retourne la liste des clés lues dans l'index
        void getKeys(std::vector<std::string> &keys);
    protected:
    private:
};

}        // Fin "namespace USpeedGameEngine"

#endif
