#pragma once

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

using PELEntryIface = sdbusplus::server::org::open_power::logging::pel::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
