#pragma once

#include <string>
#include <csignal>
#include <unordered_map>

namespace aqsi {
namespace os {

/// Список доступных сигналов для kill
enum class KillSignals : size_t {
    kSighup  = SIGHUP,
    kSigint  = SIGINT,
    kSigQuit = SIGQUIT,
    kSigill  = SIGILL,
    kSigabrt = SIGABRT,
    kSigfpe  = SIGFPE,
    kSigkill = SIGKILL,
    kSigsegv = SIGSEGV,
    kSigpipe = SIGPIPE,
    kSigalrm = SIGALRM,
    kSigterm = SIGTERM,
    kSigusr1 = SIGUSR1,
    kSigusr2 = SIGUSR2,
    kSigchld = SIGCHLD,
    kSigcont = SIGCONT,
    kSigstop = SIGSTOP,
    kSigtstp = SIGTSTP,
    kSigttin = SIGTTIN,
    kSigttou = SIGTTOU
};

/// Список поддерживаемых файловых систем
enum class FSTypes : size_t {
    kUnknown,
    kExt4,
    kExt3,
    kExt2,
    kBtrfs,
    kXfs,
    kVfat,
    kNtfs,
    kIso0660,
    kNfs,
    kTmpfs,
    kProc,
    kSysfs,
    kCifs,
    kHfs,
    kHfsPlus,
    kJfs,
    kReiserfs,
    kF2fs,
    kExfat,
    kUbifs,
    kCgroup,
    kCgroup2,
    kMqueue,
    kOverlay,
    kDevpts,
    kConfigfs
};

/// Список поддерживаемых подсистем
enum class Subsystems : size_t {
    kUnknown,
    kBlock,
    kNet,
    kUsb,
    kPci,
    kSound,
    kInput,
    kTty,
    kScsi,
    kVideo4Linux,
    kGpio,
    kPowerSupply,
    kI2C,
    kMtd,
    kDmi,
    kBdi,
    kChar,
    kW1,
    kRfkill,
    kHid
};

/**
    \brief Получение списка файловых систем
    \details Эта функция возвращает unordered_map строк и перечисления FSTypes
    \return FSTypes Список файловых систем
 */
std::unordered_map<std::string_view, FSTypes> const getFSMap();
/**
    \brief Получение списка подсистем систем
    \details Эта функция возвращает unordered_map строк и перечисления Subsystems
    \return Subsystems Список подсистем
 */
std::unordered_map<std::string_view, Subsystems> const getSubsystemMap();

/**
    \brief Преобразует массив символов в тип FSTypes
    \details Эта функция принимает тип файловой системы строкой, и возвращает перечисление типов
        файловых систем FSTypes
    \param [in] fstype Тип файловой системы, который нужно преобразовать.
    \return Тип файловой системы FSTypes
 */
FSTypes getFStypeEnum(char const* fstype);

/**
    \brief Преобразует тип FSTypes в строку
    \details Эта функция принимает тип файловой системы, и возвращает строку
    \param [in] fstype Тип файловой системы, который нужно преобразовать.
    \return Тип файловой системы std::string
 */
std::string const getFStypeString(FSTypes const& fstype);

/**
    \brief Преобразует массив символов в тип Subsystems
    \details Эта функция принимает тип подсистемы, и возвращает перечисление типов подсистем Subsystems
    \param [in] subsystem Тип подсистемы, который нужно преобразовать.
    \return Subsystems Тип подсистемы
 */
Subsystems getSubsystemEnum(char const* subsystem);

/**
    \brief Преобразует массив символов в тип Subsystems
    \details Эта функция принимает тип подсистемы, и возвращает перечисление типов подсистем Subsystems
    \param [in] subsystem Тип подсистемы, который нужно преобразовать.
    \return Subsystems Тип подсистемы
 */
std::string const getSubsystemString(Subsystems const& subsystem);

}  // namespace os
}  // namespace aqsi
