#pragma once

#include "fru_identity.hpp"
#include "mru.hpp"
#include "pce_identity.hpp"
#include "pel_types.hpp"
#include "stream.hpp"

namespace openpower
{
namespace pels
{
namespace src
{

/**
 * @class Callout
 *
 * Represents a single FRU callout in the SRC's FRU callout
 * subsection.
 *
 * The 'Callouts' class holds a list of these objects.
 *
 * The callout priority and location code are in this structure.
 *
 * There can also be up to one each of three types of substructures
 * in a single callout:
 *  * FRU Identity  (must be first if present)
 *  * Power Controlling Enclosure (PCE)
 *  * Manufacturing Replaceable Unit (MRU)
 *
 * These substructures have their own objects managed by unique_ptrs
 * which will only be allocated if those substructures exist.
 */
class Callout
{
  public:
    /**
     * @brief Which callout substructures are included.
     */
    enum calloutFlags
    {
        calloutType = 0b0010'0000,
        fruIdentIncluded = 0b0000'1000,
        mruIncluded = 0b0000'0100

        // Leaving out the various PCE identity ones since
        // we don't use them.
    };

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

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

    /**
     * @brief Constructor
     *
     * Creates the objects with a FRUIdentity substructure that calls
     * out a normal hardware FRU.
     *
     * @param[in] priority - The priority of the callout
     * @param[in] locationCode - The location code of the callout
     * @param[in] partNumber - The part number of the callout
     * @param[in] ccin - The CCIN of the callout
     * @param[in] serialNumber - The serial number of the callout
     */
    Callout(CalloutPriority priority, const std::string& locationCode,
            const std::string& partNumber, const std::string& ccin,
            const std::string& serialNumber);

    /**
     * @brief Constructor
     *
     * Creates the objects with a FRUIdentity substructure that calls
     * out a normal hardware FRU, and takes a list of MRUs that will
     * be added to the callout.
     *
     * @param[in] priority - The priority of the callout
     * @param[in] locationCode - The location code of the callout
     * @param[in] partNumber - The part number of the callout
     * @param[in] ccin - The CCIN of the callout
     * @param[in] serialNumber - The serial number of the callout
     * @param[in] mrus - The MRUs, if any, to add to the callout
     */
    Callout(CalloutPriority priority, const std::string& locationCode,
            const std::string& partNumber, const std::string& ccin,
            const std::string& serialNumber,
            const std::vector<MRU::MRUCallout>& mrus);

    /**
     * @brief Constructor
     *
     * Creates the objects with a FRUIdentity substructure that calls
     * out a maintenance procedure.
     *
     * @param[in] priority - The priority of the callout
     * @param[in] procedure - The maintenance procedure name
     * @param[in] type - If the procedure is the raw name or the registry name
     */
    Callout(CalloutPriority priority, const std::string& procedure,
            CalloutValueType type);

    /**
     * @brief Constructor
     *
     * Creates the objects with a FRUIdentity substructure that calls
     * out a maintenance procedure.
     *
     * @param[in] priority - The priority of the callout
     * @param[in] procedureFromRegistry - The maintenance procedure name
     *                                    as defined in the message registry.
     */
    Callout(CalloutPriority priority,
            const std::string& procedureFromRegistry) :
        Callout(priority, procedureFromRegistry, CalloutValueType::registryName)
    {
    }

    /**
     * @brief Constructor
     *
     * Creates the objects with a FRUIdentity substructure that calls
     * out a symbolic FRU.
     *
     * @param[in] priority - The priority of the callout
     * @param[in] symbolicFRU - The symbolic FRU name
     * @param[in] type - If the FRU is the raw name or the registry name
     * @param[in] locationCode - The location code of the callout
     * @param[in] trustedLocationCode - If the location is trusted
     */
    Callout(CalloutPriority priority, const std::string& symbolicFRU,
            CalloutValueType type, const std::string& locationCode,
            bool trustedLocationCode);

    /**
     * @brief Constructor
     *
     * Creates the objects with a FRUIdentity substructure that calls
     * out a symbolic FRU.
     *
     * @param[in] priority - The priority of the callout
     * @param[in] symbolicFRUFromRegistry - The symbolic FRU name as
     *                                      defined in the message registry.
     * @param[in] locationCode - The location code of the callout
     * @param[in] trustedLocationCode - If the location is trusted
     */
    Callout(CalloutPriority priority,
            const std::string& symbolicFRUFromRegistry,
            const std::string& locationCode, bool trustedLocationCode) :
        Callout(priority, symbolicFRUFromRegistry,
                CalloutValueType::registryName, locationCode,
                trustedLocationCode)
    {
    }

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

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

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

    /**
     * @brief Returns the priority field of a callout
     *
     * @return uint8_t - The priority
     */
    uint8_t priority() const
    {
        return _priority;
    }

    /**
     * @brief Returns the location code of the callout
     *
     * @return std::string - The location code
     */
    std::string locationCode() const
    {
        std::string lc;
        if (!_locationCode.empty())
        {
            // NULL terminated
            lc = static_cast<const char*>(_locationCode.data());
        }
        return lc;
    }

    /**
     * @brief Returns the location code size
     *
     * @return size_t - The size, including the terminating null.
     */
    size_t locationCodeSize() const
    {
        return _locationCodeSize;
    }

    /**
     * @brief Returns the FRU identity substructure
     *
     * @return const std::unique_ptr<FRUIdentity>&
     */
    const std::unique_ptr<FRUIdentity>& fruIdentity() const
    {
        return _fruIdentity;
    }

    /**
     * @brief Returns the PCE identity substructure
     *
     * @return const std::unique_ptr<PCEIdentity>&
     */
    const std::unique_ptr<PCEIdentity>& pceIdentity() const
    {
        return _pceIdentity;
    }

    /**
     * @brief Returns the MRU identity substructure
     *
     * @return const std::unique_ptr<MRU>&
     */
    const std::unique_ptr<MRU>& mru() const
    {
        return _mru;
    }

  private:
    /**
     * @brief Sets the location code field
     *
     * @param[in] locationCode - The location code string
     */
    void setLocationCode(const std::string& locationCode);

    /**
     * @brief The size of this structure in the PEL
     */
    uint8_t _size;

    /**
     * @brief The flags byte of this structure
     */
    uint8_t _flags;

    /**
     * @brief The replacement priority
     */
    uint8_t _priority;

    /**
     * @brief The length of the location code field.
     *
     * Includes the NULL termination, and must be a
     * multiple of 4 (padded with zeros)
     */
    uint8_t _locationCodeSize = 0;

    /**
     * @brief NULL terminated location code
     *
     * Includes the NULL termination, and must be a
     * multiple of 4 (padded with zeros)
     */
    std::vector<char> _locationCode;

    /**
     * @brief FRU (Field Replaceable Unit) Identity substructure
     */
    std::unique_ptr<FRUIdentity> _fruIdentity;

    /**
     * @brief PCE (Power Controlling Enclosure) Identity substructure
     */
    std::unique_ptr<PCEIdentity> _pceIdentity;

    /**
     * @brief MRU (Manufacturing Replaceable Unit) substructure
     */
    std::unique_ptr<MRU> _mru;
};

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