#ifndef COMPACTDISPLAY_H
#define	COMPACTDISPLAY_H

#include <new>
#include <stdexcept>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdint>

extern "C"
{
    #include <unistd.h>
    #include <time.h>
}

#include <GenericDisplay.h>
#include <map_types.h>
#include <DrbdResource.h>
#include <DrbdConnection.h>
#include <DrbdVolume.h>
#include <DrbdRole.h>
#include <MessageLog.h>
#include <Configurable.h>
#include <ConfigOption.h>

class CompactDisplay : public GenericDisplay, public Configurable
{
  public:
    static const std::string OPT_NO_HEADER_KEY;
    static const std::string OPT_NO_HOTKEYS_KEY;
    static const std::string OPT_ASCII_KEY;

    static const std::string HDR_SPACER;
    static const std::string NODE_DSP_PREFIX;
    static const std::string TRUNC_MARKER;

    static const ConfigOption OPT_NO_HEADER;
    static const ConfigOption OPT_NO_HOTKEYS;
    static const ConfigOption OPT_ASCII;

    static const char* F_NORM;
    static const char* F_WARN;
    static const char* F_ALERT;
    static const char* F_RESET;

    static const char* F_MARK;

    static const char* F_HEADER;

    static const char* F_RES_NORM;
    static const char* F_RES_NAME_NORM;
    static const char* F_RES_NAME_ALERT;
    static const char* F_VOL_NORM;
    static const char* F_VOL_CLIENT;
    static const char* F_VOL_MINOR;
    static const char* F_CONN_NORM;
    static const char* F_PRIMARY;
    static const char* F_SECONDARY;

    static const char* F_CONN_PRI_FG;

    static const char* F_RES_NAME;
    static const char* F_RES_COUNT;
    static const char* F_PRB_COUNT;

    static const char* F_CURSOR_POS;
    static const char* F_HOTKEY;
    static const char* F_ALERT_HOTKEY;

    static const char* UTF8_PRIMARY;
    static const char* UTF8_SECONDARY;
    static const char* UTF8_CONN_GOOD;
    static const char* UTF8_CONN_BAD;
    static const char* UTF8_DISK_GOOD;
    static const char* UTF8_DISK_BAD;
    static const char* UTF8_MARK_OFF;
    static const char* UTF8_MARK_ON;

    static const char* ASCII_PRIMARY;
    static const char* ASCII_SECONDARY;
    static const char* ASCII_CONN_GOOD;
    static const char* ASCII_CONN_BAD;
    static const char* ASCII_DISK_GOOD;
    static const char* ASCII_DISK_BAD;
    static const char* ASCII_MARK_OFF;
    static const char* ASCII_MARK_ON;

    static const char* ANSI_CLEAR;
    static const char* ANSI_CLEAR_LINE;
    static const char* ANSI_CURSOR_OFF;
    static const char* ANSI_CURSOR_ON;

    static const char HOTKEY_PGUP;
    static const char HOTKEY_PGDN;
    static const char HOTKEY_PGZERO;

    static const std::string LABEL_MESSAGES;
    static const std::string LABEL_MONITOR;
    static const std::string LABEL_PROBLEMS;
    static const std::string LABEL_STATUS;
    static const std::string LABEL_PGUP;
    static const std::string LABEL_PGDN;
    static const std::string LABEL_PGZERO;

    static const uint16_t INDENT_STEP_SIZE;
    static const uint16_t OUTPUT_BUFFER_SIZE;

    static const uint16_t MIN_SIZE_X;
    static const uint16_t MAX_SIZE_X;
    static const uint16_t MIN_SIZE_Y;
    static const uint16_t MAX_SIZE_Y;

    static const int RES_NAME_WIDTH;
    static const int ROLE_WIDTH;
    static const int VOL_NR_WIDTH;
    static const int MINOR_NR_WIDTH;
    static const int CONN_NAME_WIDTH;
    static const int CONN_STATE_WIDTH;
    static const int DISK_STATE_WIDTH;
    static const int REPL_STATE_WIDTH;

    static const uint16_t MIN_NODENAME_DSP_LENGTH;
    static const uint32_t MAX_YIELD_LOOP;

    // @throws std::bad_alloc
    CompactDisplay(
        ResourcesMap& resources_map_ref,
        MessageLog&   log_ref,
        HotkeysMap&   hotkeys_info_ref,
        const std::string* const node_name_ref
    );
    CompactDisplay(const CompactDisplay& orig) = delete;
    CompactDisplay& operator=(const CompactDisplay& orig) = delete;
    CompactDisplay(CompactDisplay&& orig) = delete;
    CompactDisplay& operator=(CompactDisplay&& orig) = delete;
    virtual ~CompactDisplay() noexcept override;

    virtual void clear();
    virtual void initial_display() override;
    virtual void status_display() override;
    virtual void display_header() const override;
    virtual void display_hotkeys_info() const;
    virtual void display_counts() const;

    virtual void set_terminal_size(uint16_t size_x, uint16_t size_y) override;
    virtual void set_utf8(bool enable);

    // @throws std::bad_alloc
    virtual void announce_options(Configurator& collector) override;

    virtual void options_help() noexcept override;

    // @throws std::bad_alloc
    virtual void set_flag(std::string& key) override;

    // @throws std::bad_alloc
    virtual void set_option(std::string& key, std::string& value) override;

    virtual void key_pressed(const char key) override;

  private:
    ResourcesMap& resources_map;
    MessageLog& log;
    HotkeysMap& hotkeys_info;

    int output_fd {STDOUT_FILENO};

    bool dsp_msg_active {false};
    bool dsp_problems_active {false};
    bool problem_alert {false};
    uint64_t problem_count {0};
    uint16_t page {0};
    uint32_t page_start {0};
    uint32_t page_end {0};

    uint16_t term_x {80};
    uint16_t term_y {25};
    uint16_t node_dsp_length {0};
    uint16_t current_x {0};
    uint32_t current_y {0};
    bool show_header {true};
    bool show_hotkeys {true};
    bool enable_term_size {true};

    bool enable_utf8 {true};
    const char* pri_icon  {UTF8_PRIMARY};
    const char* sec_icon  {UTF8_SECONDARY};
    const char* conn_good {UTF8_CONN_GOOD};
    const char* conn_bad  {UTF8_CONN_BAD};
    const char* disk_good {UTF8_DISK_GOOD};
    const char* disk_bad  {UTF8_DISK_BAD};
    const char* mark_off  {UTF8_MARK_OFF};
    const char* mark_on   {UTF8_MARK_ON};

    uint16_t indent_level {0};
    char* indent_buffer {nullptr};
    std::unique_ptr<char[]> indent_buffer_mgr {nullptr};
    char *output_buffer {nullptr};
    std::unique_ptr<char[]> output_buffer_mgr {nullptr};

    std::unique_ptr<std::string> node_label {nullptr};
    const std::string* const node_name;

    // 20 ms delay
    struct timespec write_retry_delay {0, 20000000};

    bool list_resources();
    void list_connections(DrbdResource& res);
    void list_volumes(DrbdResource& res);
    void show_volume(DrbdVolume& vol, bool peer_volume, bool long_format);
    void list_peer_volumes(DrbdConnection& conn);

    void increase_indent();
    void decrease_indent();
    void reset_indent();
    void reset_positions();
    void indent();
    bool next_column(uint16_t length);
    void next_line();
    void prepare_flags();

    void write_char(const char ch) const noexcept;
    void write_text(const char* text) const noexcept;
    void write_fmt(const char* format, ...) const noexcept;

    void write_buffer(const char* buffer, size_t length) const noexcept;
};

#endif	/* COMPACTDISPLAY_H */
