#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::bus& bus, const std::string& path,
             const std::map<std::string, PropertiesVariant>& prop, uint32_t id,
             Repository* repo) :
        PELEntryIface(bus, path.c_str(), prop),
        _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