#ifndef DRBDCONNECTION_H
#define	DRBDCONNECTION_H

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

#include <VolumesContainer.h>
#include <DrbdRole.h>
#include <StateFlags.h>

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

class DrbdConnection : public VolumesContainer, public DrbdRole, private StateFlags
{
  public:
    enum class state : uint16_t
    {
        STANDALONE,
        DISCONNECTING,
        UNCONNECTED,
        TIMEOUT,
        BROKEN_PIPE,
        NETWORK_FAILURE,
        PROTOCOL_ERROR,
        TEAR_DOWN,
        CONNECTING,
        CONNECTED,
        UNKNOWN
    };

    static const std::string PROP_KEY_CONNECTION;
    static const std::string PROP_KEY_CONN_NAME;
    static const std::string PROP_KEY_PEER_NODE_ID;

    static const char* CS_LABEL_STANDALONE;
    static const char* CS_LABEL_DISCONNECTING;
    static const char* CS_LABEL_UNCONNECTED;
    static const char* CS_LABEL_TIMEOUT;
    static const char* CS_LABEL_BROKEN_PIPE;
    static const char* CS_LABEL_NETWORK_FAILURE;
    static const char* CS_LABEL_PROTOCOL_ERROR;
    static const char* CS_LABEL_TEAR_DOWN;
    static const char* CS_LABEL_CONNECTING;
    static const char* CS_LABEL_CONNECTED;
    static const char* CS_LABEL_UNKNOWN;

    // @throws std::bad_alloc
    DrbdConnection(std::string& connection_name, uint8_t node_id);
    DrbdConnection(const DrbdConnection& orig) = delete;
    DrbdConnection& operator=(const DrbdConnection& orig) = delete;
    DrbdConnection(DrbdConnection&& orig) = delete;
    DrbdConnection& operator=(DrbdConnection&& orig) = delete;
    virtual ~DrbdConnection() noexcept override
    {
    }

    virtual const std::string& get_name() const;
    virtual const uint8_t get_node_id() const;

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

    virtual state get_connection_state() const;
    virtual const char* get_connection_state_label() const;

    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_connection_alert();
    virtual bool has_role_alert();

    // Creates (allocates and initializes) a new DrbdConnection 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 DrbdConnection object
    // @throws std::bad_alloc, EventMessageException
    static DrbdConnection* new_from_props(PropsMap& event_props);

    // @throws EventMessageException
    static state parse_state(std::string& state_name);

  private:
    const std::string name;
    const uint8_t node_id;
    state conn_state;
    bool conn_alert {false};
    bool role_alert {false};
};

#endif	/* DRBDCONNECTION_H */
