#pragma once

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

#include <array>

namespace attn
{
namespace pel
{

constexpr uint8_t extendedUserHeaderVersion = 0x01;
constexpr size_t firmwareVersionSize = 16;

/**
 * @class ExtendedUserHeader
 *
 * This represents the Extended User Header section in a PEL
 *
 * |----------+---------------------------+-------+-------+-------------------|
 * | length   | byte0                     | byte1 | byte2 | byte3             |
 * |----------+---------------------------+-------+-------+-------------------|
 * | 8        | Section Header                                                |
 * |----------+---------------------------------------------------------------|
 * | 20       | Machine Type/Model/Serial                                     |
 * |----------+---------------------------------------------------------------|
 * | 16       | FW Released Version                                           |
 * |----------+---------------------------------------------------------------|
 * | 16       | FW Sub-system driver ver.                                     |
 * |----------+---------------------------+-------+-------+-------------------|
 * | 4        | Reserved                  | rsvd  | rsvd  | Symptom ID length |
 * |----------+---------------------------+-------+-------+-------------------|
 * | 8        | Event Common Reference Time                                   |
 * |----------+---------------------------------------------------------------|
 * | 4        | Reserved                                                      |
 * |----------+---------------------------------------------------------------|
 * | variable | Symptom ID                                                    |
 * |----------+---------------------------------------------------------------|
 *
 */
class ExtendedUserHeader : public Section
{
  public:
    ExtendedUserHeader() = delete;
    ~ExtendedUserHeader() = default;
    ExtendedUserHeader(const ExtendedUserHeader&) = default;
    ExtendedUserHeader& operator=(const ExtendedUserHeader&) = default;
    ExtendedUserHeader(ExtendedUserHeader&&) = default;
    ExtendedUserHeader& operator=(ExtendedUserHeader&&) = default;

    /**
     * @brief Constructor
     *
     * Fills in this class's data fields from raw data.
     *
     * @param[in] pel - the PEL data stream
     */
    explicit ExtendedUserHeader(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 Returns the size of this section when flattened into a PEL
     *
     * @return size_t - the size of the section
     */
    size_t flattenedSize()
    {
        return Section::flattenedSize() + mtmsSize + _serverFWVersion.size() +
               _subsystemFWVersion.size() + sizeof(_reserved4B) +
               sizeof(_refTime) + sizeof(_reserved1B1) + sizeof(_reserved1B2) +
               sizeof(_reserved1B3) + sizeof(_symptomIdSize) + _symptomIdSize;
    }

    /**
     * @brief Set the symptom id field in extended user header
     *
     * @param[in] symptomId - The symptom ID to set
     */
    void setSymptomId(const std::string& symptomId);

  private:
    /**
     * @brief The structure that holds the machine TM and SN fields.
     */
    uint8_t _mtms[mtmsSize];

    /**
     * @brief The server firmware version
     *
     * NULL terminated.
     *
     * The release version of the full firmware image.
     */
    std::array<uint8_t, firmwareVersionSize> _serverFWVersion;

    /**
     * @brief The subsystem firmware version
     *
     * NULL terminated.
     *
     * On PELs created on the BMC, this will be the BMC code version.
     */
    std::array<uint8_t, firmwareVersionSize> _subsystemFWVersion;

    /**
     * @brief Reserved
     */
    uint32_t _reserved4B = 0;

    /**
     * @brief Event Common Reference Time
     *
     * This is not used by PELs created on the BMC.
     */
    uint64_t _refTime;

    /**
     * @brief Reserved
     */
    uint8_t _reserved1B1 = 0;

    /**
     * @brief Reserved
     */
    uint8_t _reserved1B2 = 0;

    /**
     * @brief Reserved
     */
    uint8_t _reserved1B3 = 0;

    /**
     * @brief The size of the symptom ID field
     */
    uint8_t _symptomIdSize;

    /**
     * @brief The symptom ID field
     *
     * Describes a unique event signature for the log.
     * Required for serviceable events, otherwise optional.
     * When present, must start with the first 8 characters
     * of the ASCII string field from the SRC.
     *
     * NULL terminated.
     */
    std::vector<uint8_t> _symptomId;
};

} // namespace pel
} // namespace attn
