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

#ifndef LOTRO_DAT_PATCHER_DATFILE_H
#define LOTRO_DAT_PATCHER_DATFILE_H

#ifdef LOTRO_DAT_EXPORTS
#define LOTRO_DAT_API __declspec(dllexport)
#else
#define LOTRO_DAT_API __declspec(dllimport)
#endif

#include <bits/unique_ptr.h>
#include "DatSubsystems/DatBackupManager.h"
#include "DatSubsystems/DatExporter.h"
#include "DatSubsystems/DatFileSystem.h"
#include "DatSubsystems/DatIO.h"
#include "DatSubsystems/DatLocaleManager.h"
#include "DatSubsystems/DatPatcher.h"

// Dat file names definitions

extern "C++"
{
namespace LOTRO_DAT {
    enum FILE_TYPE : int {
        TEXT = 0,
        JPG = 1,
        DDS = 2,
        WAV = 3,
        OGG = 4,
        FONT = 5,
        UNKNOWN = 6
    };

    class DatFile {
        friend class DatIO;
        friend class DatFileSystem;
        friend class DatLocaleManager;
        friend class DatPatcher;
        friend class DatExporter;
        friend class DatBackupManager;

    public:
        DatFile();
        DatFile(const DatFile &other) = delete;
        DatFile(DatFile &&other) = default;
        DatFile &operator=(const DatFile &other) = delete;
        DatFile &operator=(DatFile &&other) = default;

        DatLocaleManager &getLocaleManager();
//        DatExporter &getExporter();
//        DatPatcher &getPatcher();
//        DatBackupManager &getBackupManager();
        DatIO &getIO();
        DatFileSystem &getFileSystem();

        DatOperationResult<> Initialise(const std::string &filename);
        DatOperationResult<> GatherInformation(const std::string &output_filename);
        DatOperationResult<> Deinitialize();
        bool Initialized();

    private:
        std::unique_ptr<DatIO> io_;
        std::unique_ptr<DatFileSystem> fileSystem_;
        std::unique_ptr<DatLocaleManager> localeManager_;
//        std::unique_ptr<DatPatcher> patcher_;
//        std::unique_ptr<DatExporter> exporter_;
//        std::unique_ptr<DatBackupManager> backupManager_;
        bool initialized_;
    };
}
}

#endif //LOTRO_DAT_PATCHER_DATFILE_H