#pragma once

#include "stream.hpp"

namespace openpower
{
namespace pels
{
namespace src
{

/**
 * @class MRU
 *
 * This represents the MRU (Manufacturing Replaceable Unit)
 * substructure in the callout subsection of the SRC PEL section.
 *
 * Manufacturing replaceable units have a finer granularity than
 * a field replaceable unit, such as a chip on a card, and are
 * intended to be used during manufacturing.
 *
 * This substructure can contain up to 128 MRU callouts, each
 * containing a MRU ID and a callout priority value.
 */
class MRU
{
  public:
    /**
     * @brief A single MRU callout, which contains a priority
     *        and a MRU ID.
     *
     * The priority value is the same priority type character
     * value as in the parent callout structure. For alignment
     * purposes it is a 4 byte field, though only the LSB contains
     * the priority value.
     */
    struct MRUCallout
    {
        uint32_t priority;
        uint32_t id;
    };

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

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

    /**
     * @brief Constructor
     *
     * Creates the object using the passed in MRUs
     *
     * @param[in] mrus - The  MRUs
     */
    explicit MRU(const std::vector<MRUCallout>& mrus);

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

    /**
     * @brief Returns the size of this structure when flattened into a PEL
     *
     * @return size_t - The size of the section
     */
    size_t flattenedSize() const
    {
        return _size;
    }

    /**
     * @brief Returns the contained MRU callouts.
     *
     * @return const std::vector<MRUCallout>& - The MRUs
     */
    const std::vector<MRUCallout>& mrus() const
    {
        return _mrus;
    }

    /**
     * @brief Returns the size field
     *
     * @return size_t - The size of the MRU substructure
     */
    size_t size() const
    {
        return _size;
    }

    /**
     * @brief Returns the flags field
     *
     * @return uint8_t - The flags
     */
    uint8_t flags() const
    {
        return _flags;
    }

    /**
     * @brief The type identifier value of this structure.
     */
    static const uint16_t substructureType = 0x4D52; // "MR"

  private:
    /**
     * @brief The callout substructure type field. Will be 'MR'.
     */
    uint16_t _type;

    /**
     * @brief The size of this callout structure.
     */
    uint8_t _size;

    /**
     * @brief The flags byte of this substructure.
     *
     * 0x0Y: Y = number of MRU callouts
     */
    uint8_t _flags;

    /**
     * @brief Reserved 4 bytes
     */
    uint32_t _reserved4B;

    /*
     * @brief The MRU callouts
     */
    std::vector<MRUCallout> _mrus;
};

} // namespace src
} // namespace pels
} // namespace openpower
