#pragma once

#include "pel_common.hpp"
#include "pel_section.hpp"
#include "stream.hpp"

#include <array>

namespace attn
{
namespace pel
{

/**
 * @class PrimarySrc
 *
 * @brief This class represents the primary SRC sections in the PEL.
 *
 * |--------+--------------------------------------------|
 * | length | field                                      |
 * |--------+--------------------------------------------|
 * | 1      | Version = 0x02                             |
 * |--------+--------------------------------------------|
 * | 1      | Flags = 0x00 (no additional data sections) |
 * |--------+--------------------------------------------|
 * | 1      | reserved                                   |
 * |--------+--------------------------------------------|
 * | 1      | Number of words of hex data + 1 = 0x09     |
 * |--------+--------------------------------------------|
 * | 2      | reserved                                   |
 * |--------+--------------------------------------------|
 * | 2      | Total length of SRC in bytes = 0x48        |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 2 (word 1 intentionally skipped)  |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 3                                 |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 4                                 |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 5                                 |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 6                                 |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 7                                 |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 8                                 |
 * |--------+--------------------------------------------|
 * | 4      | Hex Word 9                                 |
 * |--------+--------------------------------------------|
 * | 32     | ASCII String                               |
 * |--------+--------------------------------------------|
 */
class PrimarySrc : public Section
{
  public:
    enum HeaderFlags
    {
        additionalSections  = 0x01,
        powerFaultEvent     = 0x02,
        hypDumpInit         = 0x04,
        i5OSServiceEventBit = 0x10,
        virtualProgressSRC  = 0x80
    };

    PrimarySrc()                  = delete;
    ~PrimarySrc()                 = default;
    PrimarySrc(const PrimarySrc&) = delete;
    PrimarySrc& operator=(const PrimarySrc&) = delete;
    PrimarySrc(PrimarySrc&&)                 = delete;
    PrimarySrc& operator=(PrimarySrc&&) = delete;

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

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

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

    /**
     * @brief Set the SRC words
     *
     * @param[in] srcWords - The SRC words
     */
    void setSrcWords(std::array<uint32_t, numSrcWords> srcWords);

    /**
     * @brief Set the ascii string field
     *
     * @param[in]  asciiString - The ascii string
     */
    void setAsciiString(std::array<char, asciiStringSize> asciiString);

  private:
    /**
     * @brief The SRC version field
     */
    uint8_t _version = 0x02;

    /**
     * @brief The SRC flags field
     */
    uint8_t _flags = 0;

    /**
     * @brief A byte of reserved data after the flags field
     */
    uint8_t _reserved1B = 0;

    /**
     * @brief The hex data word count.
     */
    uint8_t _wordCount = numSrcWords + 1; // +1 for backward compatability

    /**
     * @brief Two bytes of reserved data after the hex word count
     */
    uint16_t _reserved2B = 0;

    /**
     * @brief The total size of the SRC section (w/o section header)
     */
    uint16_t _size = 72; // 72 (bytes) = size of basic SRC section

    /**
     * @brief The SRC 'hex words'.
     */
    std::array<uint32_t, numSrcWords> _srcWords;

    /**
     * @brief The 32 byte ASCII character string of the SRC
     */
    std::array<char, asciiStringSize> _asciiString;
};

} // namespace pel
} // namespace attn
