#pragma once

#include "bcd_time.hpp"
#include "section.hpp"
#include "stream.hpp"

namespace openpower
{
namespace pels
{

struct CreatorVersion
{
    uint8_t version[8];

    CreatorVersion()
    {
        memset(version, '\0', sizeof(version));
    }
};

static constexpr uint8_t privateHeaderVersion = 0x01;
static constexpr uint8_t minSectionCount = 2;

/**
 * @class PrivateHeader
 *
 * This represents the Private Header section in a PEL.  It is required,
 * and it is always the first section.
 *
 * The Section base class handles the section header structure that every
 * PEL section has at offset zero.
 *
 * The fields in this class directly correspond to the order and sizes of
 * the fields in the section.
 */
class PrivateHeader : public Section
{
  public:
    PrivateHeader() = delete;
    ~PrivateHeader() = default;
    PrivateHeader(const PrivateHeader&) = default;
    PrivateHeader& operator=(const PrivateHeader&) = default;
    PrivateHeader(PrivateHeader&&) = default;
    PrivateHeader& operator=(PrivateHeader&&) = default;

    /**
     * @brief Constructor
     *
     * Creates a valid PrivateHeader with the passed in data
     *
     * @param[in] componentID - the creator's component ID
     * @param[in] obmcLogID - the corresponding OpenBMC event log ID
     * @param[in] timestamp - the creation timestamp, in epoch milliseconds
     */
    PrivateHeader(uint16_t componentID, uint32_t obmcLogID, uint64_t timestamp);

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

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

    /**
     * @brief Returns the creation timestamp
     *
     * @return BCDTime& - the timestamp
     */
    BCDTime& createTimestamp()
    {
        return _createTimestamp;
    }

    /**
     * @brief Returns the commit time timestamp
     *
     * @return BCDTime& - the timestamp
     */
    BCDTime& commitTimestamp()
    {
        return _commitTimestamp;
    }

    /**
     * @brief Returns the creator ID field
     *
     * @return uint8_t& - the creator ID
     */
    uint8_t& creatorID()
    {
        return _creatorID;
    }

    /**
     * @brief Returns the log type field
     *
     * @return uint8_t& - the log type
     */
    uint8_t& logType()
    {
        return _logType;
    }

    /**
     * @brief Returns the section count field
     *
     * @return uint8_t& - the section count
     */
    uint8_t& sectionCount()
    {
        return _sectionCount;
    }

    /**
     * @brief Returns the OpenBMC log ID field
     *
     * This is the ID the OpenBMC event log that corresponds
     * to this PEL.
     *
     * @return uint32_t& - the OpenBMC event log ID
     */
    uint32_t& obmcLogID()
    {
        return _obmcLogID;
    }

    /**
     * @brief Returns the Creator Version field
     *
     * @return CreatorVersion& - the creator version
     */
    CreatorVersion& creatorVersion()
    {
        return _creatorVersion;
    }

    /**
     * @brief Returns the error log ID field
     *
     * @return uint32_t& - the error log ID
     */
    uint32_t& id()
    {
        return _id;
    }

    /**
     * @brief Returns the platform log ID field
     *
     * @return uint32_t& - the platform log ID
     */
    uint32_t& plid()
    {
        return _plid;
    }

    /**
     * @brief Returns the size of this section when flattened into a PEL
     *
     * @return size_t - the size of the section
     */
    static constexpr size_t flattenedSize()
    {
        return Section::flattenedSize() + sizeof(_createTimestamp) +
               sizeof(_commitTimestamp) + sizeof(_creatorID) +
               sizeof(_logType) + sizeof(_reservedByte) +
               sizeof(_sectionCount) + sizeof(_obmcLogID) +
               sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id);
    }

  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 The creation time timestamp
     */
    BCDTime _createTimestamp;

    /**
     * @brief The commit time timestamp
     */
    BCDTime _commitTimestamp;

    /**
     * @brief The creator ID field
     */
    uint8_t _creatorID;

    /**
     * @brief The log type field
     */
    uint8_t _logType;

    /**
     * @brief A reserved byte.
     */
    uint8_t _reservedByte;

    /**
     * @brief The section count field, which is the total number
     * of sections in the PEL.
     */
    uint8_t _sectionCount;

    /**
     * @brief The OpenBMC event log ID that corresponds to this PEL.
     */
    uint32_t _obmcLogID;

    /**
     * @brief The creator subsystem version field
     */
    CreatorVersion _creatorVersion;

    /**
     * @brief The platform log ID field
     */
    uint32_t _plid;

    /**
     * @brief The log entry ID field
     */
    uint32_t _id;
};

/**
 * @brief Stream extraction operator for the CreatorVersion
 *
 * @param[in] s - the stream
 * @param[out] cv - the CreatorVersion object
 */
Stream& operator>>(Stream& s, CreatorVersion& cv);

/**
 * @brief Stream insertion operator for the CreatorVersion
 *
 * @param[out] s - the stream
 * @param[in] cv - the CreatorVersion object
 */
Stream& operator<<(Stream& s, CreatorVersion& cv);

} // namespace pels
} // namespace openpower
