#pragma once
#include "common/utils.hpp"
#include "pldmd/handler.hpp"

namespace pldm
{
namespace responder
{

namespace platform_config
{
using namespace pldm::utils;

static constexpr auto compatibleInterface =
    "xyz.openbmc_project.Inventory.Decorator.Compatible";
static constexpr auto namesProperty = "Names";

using SystemTypeCallback = std::function<void(const std::string&, bool)>;

class Handler : public CmdHandler
{
  public:
    Handler(const fs::path sysDirPath = {}) : sysDirPath(sysDirPath)
    {
        systemCompatibleMatchCallBack =
            std::make_unique<sdbusplus::bus::match_t>(
                pldm::utils::DBusHandler::getBus(),
                sdbusplus::bus::match::rules::interfacesAdded() +
                    sdbusplus::bus::match::rules::sender(
                        "xyz.openbmc_project.EntityManager"),
                std::bind(&Handler::systemCompatibleCallback, this,
                          std::placeholders::_1));
        sysTypeCallback = nullptr;
    }

    /** @brief Interface to get the system type information using Dbus query
     *
     *  @return - the system type information
     */
    virtual std::optional<std::filesystem::path> getPlatformName();

    /** @brief D-Bus Interface added signal match for Entity Manager */
    void systemCompatibleCallback(sdbusplus::message_t& msg);

    /** @brief Registers the callback from other objects */
    void registerSystemTypeCallback(SystemTypeCallback callback);

  private:
    /** @brief Interface to get the first available directory
     *         from the received list
     *
     *  @param[in] dirPath  - Directory path to search system specific directory
     *  @param[in] dirNames - System names retrieved from remote application
     *  @return - The system type information
     */
    std::optional<std::string>
        getSysSpecificJsonDir(const fs::path& dirPath,
                              const std::vector<std::string>& dirNames);

    /** @brief system type/model */
    std::string systemType;

    /** @brief D-Bus Interface added signal match for Entity Manager */
    std::unique_ptr<sdbusplus::bus::match_t> systemCompatibleMatchCallBack;

    /** @brief Registered Callback */
    SystemTypeCallback sysTypeCallback;

    /** @brief system specific json file directory path */
    fs::path sysDirPath;
};

} // namespace platform_config

} // namespace responder

} // namespace pldm
