#pragma once
#include <bitset>

namespace attn
{

/** @brief configuration flags */
enum AttentionFlag
{
    enVital       = 0,
    enCheckstop   = 1,
    enTerminate   = 2,
    enBreakpoints = 3,
    dfltTi        = 4,
    lastFlag
};

/** @brief Objhects to hold configuration data */
class Config
{
  public: // methods
    /** @brief Default constructor */
    Config();

    /** @brief Default destructor */
    ~Config() = default;

    /** @brief Get state of flag */
    bool getFlag(AttentionFlag i_flag) const;

    /** @brief Set configuration flag */
    void setFlag(AttentionFlag i_flag);

    /** @brief Set all configuration flags */
    void setFlagAll();

    /** @brief Clear configuration flag */
    void clearFlag(AttentionFlag i_flag);

    /** @brief Clear all configuration flags */
    void clearFlagAll();

    /** @brief Set state of all configuration data */
    void setConfig(bool i_vital, bool i_checkstop, bool i_terminate,
                   bool i_breakpoints);

  private:
    std::bitset<lastFlag> iv_flags; // configuration flags
};

} // namespace attn
