#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> bootManager,
                         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()),
    bootManager(std::move(bootManager)), util(std::move(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();
    }

    bootManager->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 :
         (bootManager->isRebooting() ? bootManager->getCheckpoints()
                                     : bootManager->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;
    }

    bootManager->notifyComplete();
}

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

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

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

} // namespace boot_time_monitor
