#pragma once

#include "manager.hpp"
namespace openpower
{
namespace pels
{

using PELEntryIface = sdbusplus::org::open_power::Logging::PEL::server::Entry;
using PropertiesVariant = PELEntryIface::PropertiesVariant;

class PELEntry : public PELEntryIface
{

  public:
    PELEntry() = delete;
    PELEntry(const PELEntry&) = delete;
    PELEntry& operator=(const PELEntry&) = delete;
    PELEntry(PELEntry&&) = delete;
    PELEntry& operator=(PELEntry&&) = delete;
    virtual ~PELEntry() = default;

    /** @brief Constructor to put an object onto the bus at a dbus path.
     *  @param[in] bus - Bus to attach to.
     *  @param[in] path - Path to attach at.
     *  @param[in] prop - Default property values to be set when this interface
     * is added to the bus.
     *  @param[in] id - obmc id for this instance.
     *  @param[in] repo - Repository pointer to lookup PEL to set appropriate
     * attributes.
     */

    PELEntry(sdbusplus::bus_t& bus, const std::string& path,
             const std::map<std::string, PropertiesVariant>& prop, uint32_t id,
             Repository* repo) :
        PELEntryIface(bus, path.c_str(), prop, true),
        _obmcId(id), _repo(repo)
    {
    }

    /** @brief Update managementSystemAck flag.
     *  @param[in] value - A true value says HMC acknowledged the PEL.
     *  @returns New property value
     */
    bool managementSystemAck(bool value) override;

    /**
     * @brief Returns OpenBMC event log ID associated with this interface.
     */
    uint32_t getMyId(void) const
    {
        return _obmcId;
    }

  private:
    /**
     * @brief Corresponding OpenBMC event log id of this interface.
     */
    uint32_t _obmcId;

    /**
     * @brief Repository pointer to look for updating PEL fields.
     */
    Repository* _repo;
};

} // namespace pels
} // namespace openpower
