#pragma once

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

namespace attn
{
namespace pel
{

/**
 * @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 SectionHeader structure that every
 * PEL section has at offset zero.
 *
 * |--------+----------------------+----------+----------+---------------|
 * | length | byte0                | byte1    | byte2    | byte3         |
 * |--------+----------------------+----------+----------+---------------|
 * | 8      | Section Header                                             |
 * |        |                                                            |
 * |--------+------------------------------------------------------------|
 * | 8      | Timestamp - Creation                                       |
 * |        |                                                            |
 * |--------+------------------------------------------------------------|
 * | 8      | Timestamp - Commit                                         |
 * |        |                                                            |
 * |--------+----------------------+----------+----------+---------------|
 * | 4      | Creator ID           | reserved | reserved | section count |
 * |--------+----------------------+----------+----------+---------------|
 * | 4      | OpenBMC Event Log ID                                       |
 * |--------+------------------------------------------------------------|
 * | 8      | Creator Implementation                                     |
 * |        |                                                            |
 * |--------+------------------------------------------------------------|
 * | 4      | Platform Log ID                                            |
 * |--------+------------------------------------------------------------|
 * | 4      | Log Entry ID                                               |
 * |--------+------------------------------------------------------------|
 */
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
     *
     * Fills in this class's data fields from raw data.
     *
     * @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) 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
     */
    static constexpr size_t flattenedSize()
    {
        return Section::flattenedSize() + sizeof(_createTimestamp) +
               sizeof(_commitTimestamp) + sizeof(_creatorID) +
               sizeof(_reservedByte1) + sizeof(_reservedByte2) +
               sizeof(_sectionCount) + sizeof(_obmcLogID) +
               sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id);
    }

    /**
     * @brief Get the total number of sections in this PEL
     *
     * @return Number of sections
     */
    uint8_t getSectionCount();

    /**
     * @brief Set the total number of sections in this PEL
     *
     * @param[in] sectionCount - Number of sections
     */
    void setSectionCount(uint8_t sectionCount);

    /**
     * @brief Set the plid in this PEL
     *
     * @param[in] plid - platform log ID
     */
    void setPlid(uint32_t plid);

  private:
    /**
     * @brief The creation time timestamp
     */
    uint64_t _createTimestamp;

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

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

    /**
     * @brief A reserved byte.
     */
    uint8_t _reservedByte1 = 0;

    /**
     * @brief A reserved byte.
     */
    uint8_t _reservedByte2 = 0;

    /**
     * @brief Total number of sections in the PEL
     */
    uint8_t _sectionCount = 3; // private header, user header, primary src = 3

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

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

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

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

} // namespace pel
} // namespace attn
