#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->isRebooting() ? bm->getCheckpoints() : bm->getPreCheckpoints()))
    {
        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->isRebooting() ? bm->getDurations() : bm->getPreDurations()))
    {
        result.emplace_back(std::make_tuple(dur.name, dur.duration));
    }
    return result;
}

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

} // namespace boot_time_monitor
