#pragma once

#include "bcd_time.hpp"
#include "data_interface.hpp"
#include "elog_entry.hpp"
#include "mtms.hpp"
#include "registry.hpp"
#include "section.hpp"
#include "src.hpp"
#include "stream.hpp"

namespace openpower
{
namespace pels
{

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

/**
 * @class ExtendedUserHeader
 *
 * This represents the Extended User Header section in a PEL.  It is  a required
 * section.  It contains code versions, an MTMS subsection, and a string called
 * a symptom ID.
 *
 * The Section base class handles the section header structure that every
 * PEL section has at offset zero.
 */
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 the stream.
     *
     * @param[in] pel - the PEL data stream
     */
    explicit ExtendedUserHeader(Stream& pel);

    /**
     * @brief Constructor
     *
     * @param[in] dataIface - The DataInterface object
     * @param[in] regEntry - The message registry entry for this event
     * @param[in] src - The SRC section object for this event
     */
    ExtendedUserHeader(const DataInterfaceBase& dataIface,
                       const message::Entry& regEntry, const SRC& src);

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

    /**
     * @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() + _mtms.flattenedSize() +
               _serverFWVersion.size() + _subsystemFWVersion.size() +
               sizeof(_reserved4B) + sizeof(_refTime) + sizeof(_reserved1B1) +
               sizeof(_reserved1B2) + sizeof(_reserved1B3) +
               sizeof(_symptomIDSize) + _symptomIDSize;
    }

    /**
     * @brief Returns the server firmware version
     *
     * @return std::string - The version
     */
    std::string serverFWVersion() const
    {
        std::string version;
        for (size_t i = 0;
             i < _serverFWVersion.size() && _serverFWVersion[i] != '\0'; i++)
        {
            version.push_back(_serverFWVersion[i]);
        }
        return version;
    }

    /**
     * @brief Returns the subsystem firmware version
     *
     * @return std::string - The version
     */
    std::string subsystemFWVersion() const
    {
        std::string version;
        for (size_t i = 0;
             i < _subsystemFWVersion.size() && _subsystemFWVersion[i] != '\0';
             i++)
        {
            version.push_back(_subsystemFWVersion[i]);
        }
        return version;
    }

    /**
     * @brief Returns the machine type+model
     *
     * @return std::string - The MTM
     */
    std::string machineTypeModel() const
    {
        return _mtms.machineTypeAndModel();
    }

    /**
     * @brief Returns the machine serial number
     *
     * @return std::string - The serial number
     */
    std::string machineSerialNumber() const
    {
        return _mtms.machineSerialNumber();
    }

    /**
     * @brief Returns the Event Common Reference Time field
     *
     * @return BCDTime - The time value
     */
    const BCDTime& refTime() const
    {
        return _refTime;
    }

    /**
     * @brief Returns the symptom ID
     *
     * @return std::string - The symptom ID
     */
    std::string symptomID() const
    {
        std::string symptom;
        for (size_t i = 0; i < _symptomID.size() && _symptomID[i] != '\0'; i++)
        {
            symptom.push_back(_symptomID[i]);
        }
        return symptom;
    }

    /**
     * @brief Get section in JSON.
     *
     * @param[in] creatorID - The creator ID for the PEL
     *
     * @return std::optional<std::string> - ExtendedUserHeader section's JSON
     */
    std::optional<std::string> getJSON(uint8_t creatorID) const override;

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

    /**
     * @brief Validates the section contents
     *
     * Updates _valid (in Section) with the results.
     */
    void validate() override;

    /**
     * @brief Builds the symptom ID
     *
     * Uses the message registry to say which SRC fields to add
     * to the SRC's ASCII string to make the ID, and uses a smart
     * default if not specified in the registry.
     *
     * @param[in] regEntry - The message registry entry for this event
     * @param[in] src - The SRC section object for this event
     */
    void createSymptomID(const message::Entry& regEntry, const SRC& src);

    /**
     * @brief The structure that holds the machine TM and SN fields.
     */
    MTMS _mtms;

    /**
     * @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.
     */
    BCDTime _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 pels
} // namespace openpower
