#ifndef LOTRO_DAT_LIBRARY_DATLOCALEMANAGER_H
#define LOTRO_DAT_LIBRARY_DATLOCALEMANAGER_H

#include <memory>
#include <map>
#include <set>

#include "../DatOperationResult.h"

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

    class SubFile;

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

    class DatLocaleManager {
        friend class DatStatus;
    public:
        enum LOCALE : int {
            ORIGINAL = 0,
            PATCHED = 1
        };

        DatLocaleManager() = delete;

        DatLocaleManager(const DatLocaleManager &other) = delete;

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

        ~DatLocaleManager() = default;

        explicit DatLocaleManager(DatFile *datFilePtr);

        DatOperationResult<> Init();

        DatOperationResult<> SetLocale(LOCALE locale);

        DatOperationResult<> DeInit();

        DatOperationResult<> CommitLocales();

        LOCALE GetCurrentLocale();

        bool CheckLocaleCorrect();

        void UpdateLocaleFile(LOCALE locale, const SubFile &file);

        DatOperationResult<SubFile> GetLocaleFile(long long file_id, LOCALE locale);

        void PrintInformaion(FILE *file);

        bool CategoryIsInactive(long long category);

        void UpdateCategory(long long file_id, long long category);

        DatOperationResult<> EnableCategory(long long category);

        DatOperationResult<> DisableCategory(long long category);

        const std::set<long long>& GetInactiveCategories();

    private:
        std::map<long long, SubFile> &GetLocaleDictReference(LOCALE locale);

        void ClearData();

    private:
        DatFile *dat;
        std::map<long long, SubFile> orig_dict_;
        std::map<long long, SubFile> patch_dict_;
        std::set<long long> inactive_categories;
        LOCALE current_locale_;
    };
}
};


#endif //LOTRO_DAT_LIBRARY_DATLOCALEMANAGER_H
