#pragma once

#include "registry.hpp"
#include "stream.hpp"

#include <string>

namespace openpower
{
namespace pels
{
namespace src
{

const size_t asciiStringSize = 32;

/**
 * @class AsciiString
 *
 * This represents the ASCII string field in the SRC PEL section.
 * This 32 character string shows up on the panel on a function 11.
 *
 * The first 2 characters are the SRC type, like 'BD' or '11'.
 * Next is the subsystem, like '8D', if a BD SRC, otherwise '00'.
 * Next is the reason code, like 'AAAA'.
 * The rest is filled in with spaces.
 */
class AsciiString
{
  public:
    AsciiString() = delete;
    ~AsciiString() = default;
    AsciiString(const AsciiString&) = default;
    AsciiString& operator=(const AsciiString&) = default;
    AsciiString(AsciiString&&) = default;
    AsciiString& operator=(AsciiString&&) = default;

    /**
     * @brief Constructor
     *
     * Fills in this class's data fields from the stream.
     *
     * @param[in] pel - the PEL data stream
     */
    explicit AsciiString(Stream& stream);

    /**
     * @brief Constructor
     *
     * Fills in the class from the registry entry
     */
    explicit AsciiString(const message::Entry& entry);

    /**
     * @brief Flatten the object into the stream
     *
     * @param[in] stream - The stream to write to
     */
    void flatten(Stream& stream) const;

    /**
     * @brief Fills in the object from the stream data
     *
     * @param[in] stream - The stream to read from
     */
    void unflatten(Stream& stream);

    /**
     * @brief Return the 32 character ASCII string data
     *
     * @return std::string - The data
     */
    std::string get() const;

    /**
     * @brief Converts a byte of raw data to 2 characters
     *        and writes it to the offset.
     *
     * For example, if string is: "AABBCCDD"
     *
     * setByte(0, 0x11);
     * setByte(1, 0x22);
     * setByte(2, 0x33);
     * setByte(3, 0x44);
     *
     * results in "11223344"
     *
     * @param[in] offset - The offset into the ascii string
     * @param[in] value - The value to write (0x55 -> "55")
     */
    void setByte(size_t offset, uint8_t value);

  private:
    /**
     * @brief The ASCII string itself
     */
    std::array<char, asciiStringSize> _string;
};

} // namespace src

} // namespace pels
} // namespace openpower
