#pragma once

#include "callout.hpp"
#include "stream.hpp"

namespace openpower
{
namespace pels
{
namespace src
{

constexpr uint8_t calloutsSubsectionID = 0xC0;
constexpr size_t maxNumberOfCallouts = 10;

/**
 * @class Callouts
 *
 * This is an optional subsection of the SRC section in a PEL
 * that holds callouts (represented as Callout objects).
 * It is at the end of the SRC section, and there can only be one
 * of these present in the SRC.
 *
 * If an SRC doesn't have any callouts, this object won't be created.
 */
class Callouts
{
  public:
    ~Callouts() = default;
    Callouts(const Callouts&) = delete;
    Callouts& operator=(const Callouts&) = delete;
    Callouts(Callouts&&) = delete;
    Callouts& operator=(Callouts&&) = delete;

    /**
     * @brief Constructor
     *
     * Creates the object with no callouts.
     */
    Callouts() :
        _subsectionID(calloutsSubsectionID), _subsectionFlags(0),
        _subsectionWordLength(1)
    {}

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

    /**
     * @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 object when flattened into a PEL
     *
     * @return size_t - The size of the section
     */
    size_t flattenedSize()
    {
        return _subsectionWordLength * 4;
    }

    /**
     * @brief Returns the contained callouts
     *
     * @return const std::vector<std::unique_ptr<Callout>>&
     */
    const std::vector<std::unique_ptr<Callout>>& callouts() const
    {
        return _callouts;
    }

    /**
     * @brief Adds a callout
     *
     * @param[in] callout - The callout to add
     */
    void addCallout(std::unique_ptr<Callout> callout);

  private:
    /**
     * @brief The ID of this subsection, which is 0xC0.
     */
    uint8_t _subsectionID;

    /**
     * @brief Subsection flags.  Always 0.
     */
    uint8_t _subsectionFlags;

    /**
     * @brief Subsection length in 4B words.
     *
     * (Subsection is always a multiple of 4B)
     */
    uint16_t _subsectionWordLength;

    /**
     * @brief The contained callouts
     */
    std::vector<std::unique_ptr<Callout>> _callouts;
};

} // namespace src

} // namespace pels
} // namespace openpower
