#ifndef DRBDVOLUME_H
#define	DRBDVOLUME_H

#include <new>
#include <cstdint>
#include <string>

#include <StateFlags.h>

#include <map_types.h>
// https://github.com/raltnoeder/cppdsaext
#include <dsaext.h>
#include <utils.h>
#include <exceptions.h>

class DrbdConnection;

class DrbdVolume : private StateFlags
{
  public:
    enum class disk_state : uint16_t
    {
        DISKLESS,
        ATTACHING,
        DETACHING,
        FAILED,
        NEGOTIATING,
        INCONSISTENT,
        OUTDATED,
        UNKNOWN,
        CONSISTENT,
        UP_TO_DATE
    };

    enum class repl_state : uint16_t
    {
        OFF,
        ESTABLISHED,
        STARTING_SYNC_SOURCE,
        STARTING_SYNC_TARGET,
        WF_BITMAP_SOURCE,
        WF_BITMAP_TARGET,
        WF_SYNC_UUID,
        SYNC_SOURCE,
        SYNC_TARGET,
        PAUSED_SYNC_SOURCE,
        PAUSED_SYNC_TARGET,
        VERIFY_SOURCE,
        VERIFY_TARGET,
        AHEAD,
        BEHIND,
        UNKNOWN
    };

    enum class client_state : uint16_t
    {
        ENABLED,
        DISABLED,
        UNKNOWN
    };

    static const std::string PROP_KEY_VOL_NR;
    static const std::string PROP_KEY_MINOR;
    static const std::string PROP_KEY_DISK;
    static const std::string PROP_KEY_PEER_DISK;
    static const std::string PROP_KEY_REPLICATION;
    static const std::string PROP_KEY_CLIENT;
    static const std::string PROP_KEY_PEER_CLIENT;

    static const char* DS_LABEL_DISKLESS;
    static const char* DS_LABEL_ATTACHING;
    static const char* DS_LABEL_DETACHING;
    static const char* DS_LABEL_FAILED;
    static const char* DS_LABEL_NEGOTIATING;
    static const char* DS_LABEL_INCONSISTENT;
    static const char* DS_LABEL_OUTDATED;
    static const char* DS_LABEL_UNKNOWN;
    static const char* DS_LABEL_CONSISTENT;
    static const char* DS_LABEL_UP_TO_DATE;

    static const char* RS_LABEL_OFF;
    static const char* RS_LABEL_ESTABLISHED;
    static const char* RS_LABEL_STARTING_SYNC_SOURCE;
    static const char* RS_LABEL_STARTING_SYNC_TARGET;
    static const char* RS_LABEL_WF_BITMAP_SOURCE;
    static const char* RS_LABEL_WF_BITMAP_TARGET;
    static const char* RS_LABEL_WF_SYNC_UUID;
    static const char* RS_LABEL_SYNC_SOURCE;
    static const char* RS_LABEL_SYNC_TARGET;
    static const char* RS_LABEL_PAUSED_SYNC_SOURCE;
    static const char* RS_LABEL_PAUSED_SYNC_TARGET;
    static const char* RS_LABEL_VERIFY_SOURCE;
    static const char* RS_LABEL_VERIFY_TARGET;
    static const char* RS_LABEL_AHEAD;
    static const char* RS_LABEL_BEHIND;
    static const char* RS_LABEL_UNKNOWN;

    static const char* CS_LABEL_ENABLED;
    static const char* CS_LABEL_DISABLED;
    static const char* CS_LABEL_UNKNOWN;

    explicit DrbdVolume(uint16_t volume_nr);
    DrbdVolume(const DrbdVolume& orig) = delete;
    DrbdVolume& operator=(const DrbdVolume& orig) = delete;
    DrbdVolume(DrbdVolume&& orig) = delete;
    DrbdVolume& operator=(DrbdVolume&& orig) = delete;
    virtual ~DrbdVolume() noexcept override
    {
    }

    virtual const uint16_t get_volume_nr() const;
    virtual int32_t get_minor_nr() const;

    // @throws EventMessageException
    virtual void set_minor_nr(int32_t value);

    // @throws EventMessageException
    virtual void update(PropsMap& event_props);

    virtual disk_state get_disk_state() const;
    virtual const char* get_disk_state_label() const;
    virtual repl_state get_replication_state() const;
    virtual const char* get_replication_state_label() const;
    virtual void set_connection(DrbdConnection* conn);

    using StateFlags::has_mark_state;
    using StateFlags::has_warn_state;
    using StateFlags::has_alert_state;
    using StateFlags::set_mark;
    using StateFlags::set_warn;
    using StateFlags::set_alert;
    using StateFlags::get_state;
    virtual void clear_state_flags() override;
    virtual StateFlags::state update_state_flags() override;
    virtual bool has_disk_alert();
    virtual bool has_replication_warning();
    virtual bool has_replication_alert();

    // Creates (allocates and initializes) a new DrbdVolume object from a map of properties
    //
    // @param event_props Reference to the map of properties from a 'drbdsetup events2' line
    // @return Pointer to a newly created DrbdVolume object
    // @throws std::bad_alloc, EventMessageException
    static DrbdVolume* new_from_props(PropsMap& event_props);

    // @throws EventMessageException
    static disk_state parse_disk_state(std::string& state_name);

    // @throws EventMessageException
    static repl_state parse_repl_state(std::string& state_name);

    // @throws NumberFormatException
    static uint16_t parse_volume_nr(std::string& value_str);

    // @throws NumberFormatException
    static int32_t parse_minor_nr(std::string& value_str);

    // @throws EventMessageException
    static client_state parse_client_state(std::string& value_str);

  private:
    const uint16_t vol_nr;
    int32_t minor_nr {-1};
    disk_state vol_disk_state;
    repl_state vol_repl_state;
    client_state vol_client_state;
    DrbdConnection* connection {nullptr};
    bool disk_alert {false};
    bool repl_warn  {false};
    bool repl_alert {false};
};

#endif	/* DRBDVOLUME_H */
