//
// Created by Иван_Архипов on 07.11.2017.
//

#ifndef LOTRO_DAT_PATCHER_SUBDIRECTORY_H
#define LOTRO_DAT_PATCHER_SUBDIRECTORY_H

#include <vector>
#include <map>
#include <unordered_map>

extern "C++"
{
namespace LOTRO_DAT
{
    enum FILE_TYPE : int;
    class DatFile;
    class DatException;
    class BinaryData;
    class Subfile;

    class SubDirectory
    {
    public:
        SubDirectory();
        SubDirectory(long long offset, DatFile *dat, long long max_subdirs = 63);
        ~SubDirectory();
        void MakeDictionary(std::unordered_map<long long, Subfile*> &dict);

        void UpdateDirectories(std::unordered_map<long long, BinaryData *> &patched_files, std::unordered_map<long long, Subfile*> &dict);

    private:
        void MakeSubDirectories();
        void MakeSubFiles();

        Subfile* MakeSubfile(long long dictionary_offset, long long fragments_count, long long unknown1, long long file_id, long long file_offset,
                             long long file_size, long long timestamp, long long version, long long block_size);
        FILE_TYPE GetSubfileType(long long file_id, long long file_offset) const;

        DatFile *dat_;
        long long offset_;
        long long max_subdirs_;
        std::vector<SubDirectory *> subdirs_;
        std::vector<Subfile *> subfiles_;
    };
}
};

#endif //LOTRO_DAT_PATCHER_SUBDIRECTORY_H