#pragma once

#include "AqsiError.h"
#include "aqsi-commons-global.h"

/* AqsiErrorCode*/
/* Новые ошибки должны быть добавлены в конец этого списка. Подробнее: https://gitlab.aqsi.ru/pg-group/documentation/aqsi-cube/web-aqsi-cube-new/-/merge_requests/34#note_360815 */
enum class AQSICOMMONS_EXPORT AqsiErrorCode {
    kUnknown = 1,
    kUnsupported = 2,
    kLockFileForWriteError = 3,
    kFileOpenError = 4,
    kFileReadError = 5,
    kFileWriteError = 6,
    kFileRemoveError = 7,
    kFileRenameError = 8,
    kFileCopyError = 9,
    kFileCreateError = 10,
    kPermissionsError = 11,
    kResourceError = 12,
    kFormatError = 13,
    kContentError = 14,
    kChangeValueError = 15,
    kExecutionError = 16,
    kAbortError = 17,
    kTimeOutError = 18,
    kInvalidArgumentsError = 19,
    kNoSuchFileOrDirectoryError = 20,
    kDeviceBlockedError = 21,
    kResourceLockedError = 22,
    kRuntimeError = 23,
    kRangeError = 24,
};

typedef std::unordered_map<AqsiErrorCode, std::string_view> AqsiErrorCodeMap;

static AqsiErrorCodeMap const instanceAqsiErrorCodeMap = {
    {AqsiErrorCode::kUnknown, "Неизвестная ошибка"},
    {AqsiErrorCode::kUnsupported, "Не поддерживается"},
    {AqsiErrorCode::kLockFileForWriteError, "Ошибка блокировки файла для записи"},
    {AqsiErrorCode::kFileOpenError, "Не удалось открыть файл "},
    {AqsiErrorCode::kFileReadError, "Не удалось прочитать из файла "},
    {AqsiErrorCode::kFileWriteError, "Не удалось записать в файл "},
    {AqsiErrorCode::kFileRemoveError, "Не удалось удалить файл"},
    {AqsiErrorCode::kFileRenameError, "Не удалось переименовать файл"},
    {AqsiErrorCode::kFileCopyError, "Не удалось скопировать файл"},
    {AqsiErrorCode::kFileCreateError, "Не удалось создать файл"},
    {AqsiErrorCode::kPermissionsError, "Ошибка доступа"},
    {AqsiErrorCode::kResourceError, "Недостаточно ресурсов (например, слишком много открытых файлов, нехватка памяти и т. д.)"},
    {AqsiErrorCode::kFormatError, "Некорректный формат "},
    {AqsiErrorCode::kContentError, "Недопустимое значение "},
    {AqsiErrorCode::kChangeValueError, "Ошибка изменения значения"},
    {AqsiErrorCode::kExecutionError, "Ошибка выполнения"},
    {AqsiErrorCode::kAbortError, "Операция была прервана"},
    {AqsiErrorCode::kTimeOutError, "Таймаут"},
    {AqsiErrorCode::kInvalidArgumentsError, "Указаны неверные аргументы"},
    {AqsiErrorCode::kNoSuchFileOrDirectoryError, "Не существует такого файла или директории"},
    {AqsiErrorCode::kDeviceBlockedError, "Устройство заблокировано"},
    {AqsiErrorCode::kResourceLockedError, "Ресурс заблокирован"},
    {AqsiErrorCode::kRuntimeError, "Ошибка времени выполнения"},
    {AqsiErrorCode::kRangeError, "Значение не входит в диапазон допустимых значений"},
};
AQSICOMMONS_EXPORT std::error_code make_error_code(AqsiErrorCode);

namespace std {
template <>
struct is_error_code_enum<AqsiErrorCode> : public true_type {};
}  // namespace std
