#include "dbus_handler.hpp"

#include "log.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::IBoottimeApi> 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(std::move(api))
{}

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

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;
    }

    absl::Status status = mApi->NotifyNodeComplete(mNodeConfig);
    btm::log::LogIfError(status);
}

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

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
