#include "dbus_handler.hpp"

namespace boot_time_monitor
{
namespace dbus
{

namespace btm = boot_time_monitor;

constexpr std::string_view kPSUCheckpointName = "TrayPowerCycle";
constexpr std::string_view kPSUDurationName = "TrayPowerCycle";

Handler::Handler(sdbusplus::bus::bus& dbus, const btm::NodeConfig& nodeConfig,
                 const btm::dbus::DbusConfig& dbusConfig,
                 std::shared_ptr<btm::api::IApi> api) :
    sdbusplus::server::object::object<Duration>(dbus,
                                                dbusConfig.dbusObjPath.c_str()),
    sdbusplus::server::object::object<Checkpoint>(
        dbus, dbusConfig.dbusObjPath.c_str()),
    sdbusplus::server::object::object<Statistic>(
        dbus, dbusConfig.dbusObjPath.c_str()),
    mNodeConfig(nodeConfig), mApi(api)
{}

void Handler::setCheckpoint(std::string checkpointName, int64_t wallTime,
                            int64_t selfMeasuredDuration)
{
    if (checkpointName == kPSUCheckpointName)
        mApi->SetPSUCheckpoint(checkpointName, wallTime, selfMeasuredDuration);
    else
        mApi->SetNodeCheckpoint(mNodeConfig, checkpointName, wallTime,
                                selfMeasuredDuration);
}

std::vector<std::tuple<std::string, int64_t, int64_t>>
    Handler::getCheckpointList()
{
    return mApi->GetNodeCheckpointList(mNodeConfig);
}

void Handler::rebootComplete()
{
    if (!isRebooting())
    {
        fmt::print(stderr,
                   "[{}]: Not rebooting. Skip this `rebootComplete` command\n",
                   __FUNCTION__);
        return;
    }

    mApi->NotifyNodeComplete(mNodeConfig);
}

void Handler::setDuration(std::string durationName, int64_t duration)
{
    if (durationName == kPSUDurationName)
        mApi->SetPSUDuration(durationName, duration);
    else
        mApi->SetNodeDuration(mNodeConfig, durationName, duration);
}

std::vector<std::tuple<std::string, int64_t>> Handler::getAdditionalDurations()
{
    return mApi->GetNodeAdditionalDurations(mNodeConfig);
}

bool Handler::isRebooting() const
{
    return mApi->IsNodeRebooting(mNodeConfig);
}
} // namespace dbus
} // namespace boot_time_monitor
