#ifndef MESSAGELOG_H
#define	MESSAGELOG_H

#include <cstdint>
#include <new>
#include <memory>
#include <stdexcept>

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

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

class MessageLog
{
  public:
    static const char* MESSAGES_HEADER;

    static const char* F_ALERT_MARK;
    static const char* F_WARN_MARK;
    static const char* F_INFO_MARK;
    static const char* F_ALERT;
    static const char* F_WARN;
    static const char* F_INFO;
    static const char* F_RESET;

    static const size_t DATE_BUFFER_SIZE;
    static const char*  DATE_FORMAT;
    static const size_t DATE_LENGTH;

    static const std::string CAPACITY_ERROR;

    enum class log_level : uint32_t
    {
        INFO,
        WARN,
        ALERT
    };

    typedef struct entry_s
    {
        log_level    level;
        std::string* message;
    }
    entry;

    class EntriesIterator : dsaext::QIterator<entry>
    {
      public:
        EntriesIterator(const MessageLog& log_ref);
        EntriesIterator(const EntriesIterator& orig) = delete;
        EntriesIterator& operator=(const EntriesIterator& orig) = delete;
        EntriesIterator(EntriesIterator&& orig) = default;
        EntriesIterator& operator=(EntriesIterator&& orig) = default;
        virtual ~EntriesIterator() noexcept override;

        virtual entry* next() override;
        virtual size_t get_size() const override;
        virtual bool has_next() const override;

      private:
        const MessageLog& log_obj;
        size_t iter_index {0};
        bool circular_mode {false};
    };

    // @throws std::bad_alloc, std::out_of_range
    explicit MessageLog(size_t entries);
    MessageLog(const MessageLog& orig) = delete;
    MessageLog& operator=(const MessageLog& orig) = delete;
    MessageLog(MessageLog&& orig) = default;
    MessageLog& operator=(MessageLog&& orig) = delete;
    virtual ~MessageLog() noexcept;

    // @throws std::bad_alloc
    virtual bool has_entries() const;
    virtual void add_entry(log_level level, std::string& message);
    virtual void add_entry(log_level level, const char* message);
    virtual void clear();
    virtual void display_messages(std::FILE* out) const;

  private:
    size_t index    {0};
    bool   filled   {false};
    size_t capacity {0};

    struct timeval utc_time;
    struct tm time_fields;

    std::unique_ptr<entry*[]> log_entries;
    std::unique_ptr<char[]> date_buffer;

    void clear_impl() noexcept;
    bool format_date() noexcept;
};

#endif	/* MESSAGELOG_H */
