#pragma once

#include <algorithm>
#include <cstdint>
#include <deque>
#include <vector>

namespace sol
{

using ConsoleBuffer = std::deque<uint8_t>;

/** @class ConsoleData
 *
 *  The console data is the buffer that holds the data that comes from the host
 *  console which is to be sent to the remote console. The buffer is needed due
 *  to the latency with the IPMI remote client. The current support for the
 *  buffer is to support one instance of the SOL payload.
 */
class ConsoleData
{
  public:
    /** @brief Get the current size of the host console buffer.
     *
     *  @return size of the host console buffer.
     */
    auto size() const noexcept
    {
        return data.size();
    }

    /** @brief Read host console data.
     *
     *  This API would return the iterator to the read data from the
     *  console data buffer.
     *
     *  @return iterator to read data from the buffer
     */
    auto read() const
    {
        return data.cbegin();
    }

    /** @brief Write host console data.
     *
     *  This API would append the input data to the host console buffer.
     *
     *  @param[in] input - data to be written to the console buffer.
     */
    void write(const std::vector<uint8_t>& input)
    {
        data.insert(data.end(), input.begin(), input.end());
    }

    /** @brief Erase console buffer.
     *
     *  @param[in] size - the number of bytes to be erased from the console
     *                    buffer.
     *
     *  @note If the console buffer has less bytes that that was requested,
     *        then the available size is erased.
     */
    void erase(size_t size) noexcept
    {
        data.erase(data.begin(), data.begin() + std::min(data.size(), size));
    }

  private:
    /** @brief Storage for host console data. */
    ConsoleBuffer data;
};

} // namespace sol
