#pragma once

#include "boottime_api/boottime_api.h"
#include "boottime_api/node_config.h"

#include <boost/container/flat_map.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>
#include <sdbusplus/message.hpp>

#include <string>

namespace boot_time_monitor
{
/**
 * @brief Contains functionality related to interacting with the
 * [Phosphor-state-manager](https://github.com/openbmc/phosphor-state-manager)
 * (PSM).
 */
namespace psm
{

namespace btm = boot_time_monitor;

/**
 * @brief Configuration for interacting with PSM D-Bus interfaces.
 *
 * Stores the necessary D-Bus service names and object paths required to
 * monitor host state and operating system status properties.
 */
struct PSMConfig
{
    /** @brief D-Bus service name for the Host State interface (e.g.,
     * "xyz.openbmc_project.State.Host"). */
    std::string hostStateDbusService;
    /** @brief D-Bus object path for the Host State interface (e.g.,
     * "/xyz/openbmc_project/state/host0"). */
    std::string hostStateDbusObjPath;
    /** @brief D-Bus service name for the OS State interface (e.g.,
     * "xyz.openbmc_project.State.OperatingSystem"). */
    std::string osStateDbusService;
    /** @brief D-Bus object path for the OS State interface (e.g.,
     * "/xyz/openbmc_project/state/os"). */
    std::string osStateDbusObjPath;
};

/**
 * @brief Handles monitoring of Platform State Manager (PSM) D-Bus signals for a
 * specific node.
 *
 * This class sets up D-Bus match rules to listen for property changes on
 * the Host State (`xyz.openbmc_project.State.Host`) and OS Status
 * (`xyz.openbmc_project.State.OperatingSystem.Status`) interfaces defined
 * in the `PSMConfig`. When a relevant property changes (e.g.,
 * `CurrentHostState`, `OperatingSystemState`), it translates the new state
 * into a checkpoint name and records it using the provided `IApi` instance
 * for the associated `NodeConfig`.
 */
class Handler
{
  public:
    /**
     * @brief Constructs the PSM Handler.
     *
     * Initializes previous state variables by querying current D-Bus properties
     * and sets up D-Bus match rules to monitor for future changes.
     *
     * @param bus The sdbusplus bus connection.
     * @param nodeConfig Configuration of the node this handler monitors.
     * @param psmConfig D-Bus configuration for PSM interfaces.
     * @param api Shared pointer to the central boot time monitoring API.
     */
    Handler(sdbusplus::bus::bus& bus, const btm::NodeConfig& nodeConfig,
            const btm::psm::PSMConfig& psmConfig,
            std::shared_ptr<btm::api::IBoottimeApi> api);

  private:
    /** @brief D-Bus match rule watcher for Host State property changes. */
    std::unique_ptr<sdbusplus::bus::match::match> hostStateWatcher;
    /** @brief D-Bus match rule watcher for OS Status property changes. */
    std::unique_ptr<sdbusplus::bus::match::match> osStatusWatcher;

    /** @brief Stores the previously observed Host State to detect changes. */
    std::string mPreHostState;
    /** @brief Stores the previously observed OS State/Status to detect changes.
     */
    std::string mPreOSState;
    /** @brief Configuration of the node associated with this handler. */
    btm::NodeConfig mNodeConfig;
    /** @brief Shared pointer to the central boot time monitoring API. */
    std::shared_ptr<btm::api::IBoottimeApi> mApi;
};
} // namespace psm
} // namespace boot_time_monitor
