#pragma once
#include "boottime_api/boottime_api.h"

#include <fmt/printf.h>

#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/bus/match.hpp>
#include <xyz/openbmc_project/Time/Boot/Checkpoint/server.hpp>
#include <xyz/openbmc_project/Time/Boot/Duration/server.hpp>
#include <xyz/openbmc_project/Time/Boot/Statistic/server.hpp>

#include <cstdint>
#include <memory>
#include <string>

namespace boot_time_monitor
{

namespace dbus
{

namespace btm = boot_time_monitor;

/**
 * @brief Configuration for the D-Bus handler.
 */
struct DbusConfig
{
    /** @brief The D-Bus object path for this handler instance. */
    std::string dbusObjPath;
};

/**
 * @brief Handles D-Bus requests related to boot time monitoring for a specific
 * node.
 *
 * This class implements the D-Bus interfaces for Checkpoint, Duration, and
 * Statistic defined under `xyz.openbmc_project.Time.Boot`. It acts as a
 * bridge between incoming D-Bus calls and the underlying boot time monitoring
 * API (`api::IBoottimeApi`). Each instance of this handler is associated with a
 * specific node configuration (`NodeConfig`) and interacts with the central API
 * to record or retrieve boot time data for that node.
 */
class Handler :
    sdbusplus::server::object::object<
        sdbusplus::server::xyz::openbmc_project::time::boot::Duration>,
    sdbusplus::server::object::object<
        sdbusplus::server::xyz::openbmc_project::time::boot::Checkpoint>,
    sdbusplus::server::object::object<
        sdbusplus::server::xyz::openbmc_project::time::boot::Statistic>
{
  public:
    /**
     * @brief Constructs the D-Bus handler.
     *
     * @param dbus The sdbusplus bus connection.
     * @param nodeConfig Configuration of the node this handler manages.
     * @param dbusConfig D-Bus specific configuration (object path).
     * @param api Shared pointer to the central boot time monitoring API.
     */
    Handler(sdbusplus::bus::bus& dbus, const btm::NodeConfig& nodeConfig,
            const btm::dbus::DbusConfig& dbusConfig,
            std::shared_ptr<btm::api::IBoottimeApi> api);

    /**
     * @brief D-Bus method implementation for setting a boot checkpoint.
     *
     * Forwards the request to the appropriate API method
     * (`SetNodeCheckpoint` or `SetPSUCheckpoint`).
     *
     * @param checkpointName The name of the checkpoint.
     * @param wallTime The wall clock time (epoch time in ms).
     * @param selfMeasuredDuration Optional self-measured duration (ms).
     */
    void setCheckpoint(std::string checkpointName, int64_t wallTime,
                       int64_t selfMeasuredDuration) override;

    /**
     * @brief D-Bus method implementation for retrieving the checkpoint list.
     *
     * Retrieves the data from the API via `GetNodeCheckpointList`.
     *
     * @return A vector of tuples: (checkpoint name, wall time ms, monotonic
     * time ms).
     */
    std::vector<std::tuple<std::string, int64_t, int64_t>>
        getCheckpointList() override;

    /**
     * @brief D-Bus method implementation to signal boot completion.
     *
     * Calls `NotifyNodeComplete` on the API if the node is currently rebooting.
     */
    void rebootComplete() override;

    /**
     * @brief D-Bus method implementation for setting a boot duration.
     *
     * Forwards the request to the appropriate API method
     * (`SetNodeDuration` or `SetPSUDuration`).
     *
     * @param durationName The name of the duration measurement.
     * @param duration The measured duration in milliseconds.
     */
    void setDuration(std::string durationName, int64_t duration) override;

    /**
     * @brief D-Bus method implementation for retrieving additional durations.
     *
     * Retrieves the data from the API via `GetNodeAdditionalDurations`.
     *
     * @return A vector of tuples: (duration name, duration ms).
     */
    std::vector<std::tuple<std::string, int64_t>>
        getAdditionalDurations() override;

    /**
     * @brief D-Bus property getter implementation for checking reboot status.
     *
     * Retrieves the status from the API via `IsNodeRebooting`.
     *
     * @return True if the node is considered to be rebooting, false otherwise.
     */
    bool isRebooting() const override;

  private:
    /** @brief Configuration of the node associated with this handler. */
    NodeConfig mNodeConfig;
    /** @brief Shared pointer to the central boot time monitoring API. */
    std::shared_ptr<api::IBoottimeApi> mApi;
};
} // namespace dbus
} // namespace boot_time_monitor
