//
// Created by kikab on 04.06.2018.
//

#ifndef LOTRO_DAT_LIBRARY_DATFILESYSTEM_H
#define LOTRO_DAT_LIBRARY_DATFILESYSTEM_H

#include <set>
#include <map>
#include <utility>
#include <memory>
#include "DatOperationResult.h"

extern "C++" {
namespace LOTRO_DAT {
    class DatFile;
    class BinaryData;
    class SubFile;

    class DatFileSystem {
    public:
        DatFileSystem() = delete;
        DatFileSystem(const DatFileSystem &other) = delete;
        DatFileSystem& operator=(const DatFileSystem &other) = delete;
        ~DatFileSystem() = default;

        explicit DatFileSystem(DatFile *datFilePtr);

        DatOperationResult<> Init();

        DatOperationResult<BinaryData> GetFileData(long long file_id, long long int offset);

        DatOperationResult<SubFile> GetFile(long long file_id);

        DatOperationResult<> UpdateFile(const SubFile& file);

        DatOperationResult<> DeInit();

    private:
        //------------------------------------------------//
        // PRIVATE INIT SECTION
        //------------------------------------------------//

        DatOperationResult<> MakeDirectories();

        DatOperationResult<> MakeDictionary();

        //------------------------------------------------//
        // PRIVATE DEINIT SECTION
        //------------------------------------------------//

        DatOperationResult<> CommitDirectories();

    private:
        DatFile *dat;
        std::set<long long> subfile_pending_update;
        std::map<long long, std::shared_ptr<SubFile> > dictionary_;
    };
}
};

#endif //LOTRO_DAT_LIBRARY_DATFILESYSTEM_H