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

#ifndef LOTRO_DAT_LIBRARY_DATPATCHER_H
#define LOTRO_DAT_LIBRARY_DATPATCHER_H

#include <yaml-cpp/yaml.h>
#include "../DatOperationResult.h"

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

    /*!
     * \brief Модуль экспорта файлов
     * \author Gi1dor
     * \date 30.06.2018
     * Класс для изменения файлов в dat контейнере. Позволяет обновлять файлы, сохраняя их оригинальные версии
     *
     * \warning Объекты этого класса не должны создаваться отдельно! Созданием и управлением ими занимается класс DatFile
     */

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

        explicit DatPatcher(DatFile *datFilePtr);

        DatOperationResult<> PatchFile(const SubfileData &data, bool single_file = true);

        DatOperationResult<int> PatchAllDatabase(Database *db);

    private:
        DatOperationResult<> ApplyFilePatch(std::shared_ptr<SubFile> file, BinaryData &data);

    private:
        DatFile *dat;
    };
}
}

#endif //LOTRO_DAT_LIBRARY_DATFILEPATCHER_H