#include "dbus_handler.hpp"

#include "boot_manager.hpp"

#include <fmt/printf.h>

#include <boost/container/flat_map.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/bus/match.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
#include <xyz/openbmc_project/State/Host/server.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 <tuple>

namespace boot_time_monitor
{

DbusHandler::DbusHandler(sdbusplus::bus::bus& dbus, const std::string& objPath,
                         std::shared_ptr<BootManagerIface> bm,
                         std::shared_ptr<UtilIface> util) :
    sdbusplus::server::object::object<Duration>(dbus, objPath.c_str()),
    sdbusplus::server::object::object<Checkpoint>(dbus, objPath.c_str()),
    sdbusplus::server::object::object<Statistic>(dbus, objPath.c_str()), bm(bm),
    util(util)
{}

void DbusHandler::setCheckpoint(std::string checkpointName, int64_t wallTime,
                                int64_t selfMeasuredDuration)
{
    if (!util->isValidName(checkpointName))
    {
        throw sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument();
    }

    bm->setCheckpoint(checkpointName, wallTime, selfMeasuredDuration);
}

std::vector<std::tuple<std::string, int64_t, int64_t>>
    DbusHandler::getCheckpointList()
{
    std::vector<std::tuple<std::string, int64_t, int64_t>> result;
    for (const auto& cp : bm->getCheckpoints())
    {
        result.emplace_back(std::make_tuple(cp.name, cp.wallTime, cp.monoTime));
    }
    return result;
}

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

    bm->notifyComplete();
}

void DbusHandler::setDuration(std::string durationName, int64_t duration)
{
    if (!util->isValidName(durationName))
    {
        throw sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument();
    }

    bm->setDuration(durationName, duration);
}

std::vector<std::tuple<std::string, int64_t>>
    DbusHandler::getAdditionalDurations()
{
    std::vector<std::tuple<std::string, int64_t>> result;
    for (const auto& dur : bm->getDurations())
    {
        result.emplace_back(std::make_tuple(dur.name, dur.duration));
    }
    return result;
}

bool DbusHandler::isRebooting() const
{
    return bm->isRebooting();
}

} // namespace boot_time_monitor
