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

#ifndef LOTRO_DAT_LIBRARY_DATBACKUP_H
#define LOTRO_DAT_LIBRARY_DATBACKUP_H

#include <string>
#include "../DatOperationResult.h"

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

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

    class DatBackupManager {
    public:
        DatBackupManager() = delete;

        DatBackupManager(const DatBackupManager &other) = delete;

        DatBackupManager &operator=(const DatBackupManager &other) = delete;

        ~DatBackupManager() = default;

        explicit DatBackupManager(DatFile *datFilePtr);

        bool CheckIfBackupAvailable(const std::string &backup_datname);

        DatOperationResult<> CreateBackup(const std::string &backup_datname);

        DatOperationResult<> RestoreFromBackup(const std::string &backup_datname);

        DatOperationResult<> RemoveBackup(const std::string &backup_datname);

    private:

        DatOperationResult<> CopyDatFile(DatFile &source, FILE* target);

        DatFile *dat;

        const unsigned COPY_BLOCK_SIZE = 16 * 1024 * 1024; // 16 megabytes
    };
}
};

#endif //LOTRO_DAT_LIBRARY_DATBACKUP_H