#pragma once

#include <sdbusplus/async.hpp>
#include <sdbusplus/message/native_types.hpp>

#include <functional>
#include <string>
#include <vector>

namespace entity_manager
{

class EntityManagerInterface
{
  public:
    using Callback_t =
        std::function<void(const sdbusplus::object_path&, const std::string&)>;
    using interface_list_t = std::vector<std::string>;
    static constexpr auto serviceName = "xyz.openbmc_project.EntityManager";

    EntityManagerInterface() = delete;

    EntityManagerInterface(sdbusplus::async::context& ctx,
                           const interface_list_t& interfaceNames,
                           Callback_t addedCallback,
                           Callback_t removedCallback);

    /** Get the inventory info from Entity Manager */
    auto handleInventoryGet() -> sdbusplus::async::task<>;

  private:
    /** @brief Handle async inventory add from Entity Manager */
    auto handleInventoryAdded() -> sdbusplus::async::task<>;

    /** @brief Handle async inventory remove from Entity Manager */
    auto handleInventoryRemoved() -> sdbusplus::async::task<>;

    sdbusplus::async::context& ctx;
    interface_list_t interfaceNames;
    Callback_t addedCallback;
    Callback_t removedCallback;
};

} // namespace entity_manager
