#include "bmc_monitor_app.hpp"

#include "boot_manager.hpp"
#include "dbus_handler.hpp"
#include "utils.hpp"

#include <fmt/printf.h>

#include <boost/asio/steady_timer.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/bus.hpp>

#include <array>
#include <memory>
#include <regex>
#include <string_view>

namespace boot_time_monitor
{

constexpr std::string_view kSystemdService = "org.freedesktop.systemd1";
constexpr std::string_view kSystemdPath = "/org/freedesktop/systemd1";
constexpr std::string_view kSystemdIface = "org.freedesktop.DBus.Properties";
constexpr std::string_view kSystemdFunc = "Get";
constexpr std::string_view kSystemdParam1 = "org.freedesktop.systemd1.Manager";

constexpr std::string_view kSystemdFirmwareTime = "FirmwareTimestampMonotonic";
constexpr std::string_view kSystemdLoaderTime = "LoaderTimestampMonotonic";
constexpr std::string_view kSystemdKernelTime = "KernelTimestampMonotonic";
constexpr std::string_view kSystemdInitRDTime = "InitRDTimestampMonotonic";
constexpr std::string_view kSystemdUserspaceTime =
    "UserspaceTimestampMonotonic";
constexpr std::string_view kSystemdFinishTime = "FinishTimestampMonotonic";

struct SystemdTimestamp
{
    uint64_t firmware;
    uint64_t loader;
    uint64_t kernel;
    uint64_t initRD;
    uint64_t userspace;
    uint64_t finish;
};

namespace
{

inline std::string convertName(std::string_view name)
{
    return std::regex_replace(name.data(), std::regex("TimestampMonotonic"),
                              "");
}

} // namespace

BMCMonitorApp::BMCMonitorApp(
    sdbusplus::bus::bus& bus,
    std::shared_ptr<sdbusplus::asio::connection> conn) :
    objManager(bus, kObjPath.data()),
    util(std::make_shared<Util>()),
    cpCSV(std::make_shared<FileUtil>(util->getCPPath(kNodeName, false))),
    durCSV(std::make_shared<FileUtil>(util->getDurPath(kNodeName, false))),
    bootManager(std::make_shared<BootManager>(util, cpCSV, durCSV)),
    dbusHandler(
        std::make_shared<DbusHandler>(bus, kObjPath.data(), bootManager, util))
{
    constexpr auto kCheckBmcFinishInterval = std::chrono::seconds(10);
    static boost::asio::steady_timer BmcFinishTimer(conn->get_io_context());
    static std::function<void(const boost::system::error_code&)>
        checkBmcFinish = [this, conn, kCheckBmcFinishInterval](
                             const boost::system::error_code& ec) {
        if (ec == boost::asio::error::operation_aborted)
        {
            fmt::print(stderr, "[checkBmcFinish] BmcFinishTimer is being "
                               "canceled\n");
            // we're being canceled
            return;
        }
        else if (ec)
        {
            fmt::print(stderr, "[checkBmcFinish] Timer Error: {}\n",
                       ec.message().c_str());
            return;
        }

        constexpr uint64_t kMillisecondPerSecond = 1000;
        // The raw pointer here is safe since it points to an existing instance
        // instead of allocating a memory space.
        // We can't use `std::share_ptr<uint64_t>(&times.firmware)` because the
        // `times` will free its space while `share_ptr` will also free the same
        // space again when this constructor completed. It will cause
        // `free(): double free detected` or `free(): invalid pointer` error.
        SystemdTimestamp times;
        std::array<std::pair<std::string_view, uint64_t*>, 6> bootTimestamp = {
            std::make_pair<std::string_view, uint64_t*>(
                kSystemdFirmwareTime.data(), &times.firmware),
            std::make_pair<std::string_view, uint64_t*>(
                kSystemdLoaderTime.data(), &times.loader),
            std::make_pair<std::string_view, uint64_t*>(
                kSystemdKernelTime.data(), &times.kernel),
            std::make_pair<std::string_view, uint64_t*>(
                kSystemdInitRDTime.data(), &times.initRD),
            std::make_pair<std::string_view, uint64_t*>(
                kSystemdUserspaceTime.data(), &times.userspace),
            std::make_pair<std::string_view, uint64_t*>(
                kSystemdFinishTime.data(), &times.finish)};

        for (const auto& timestamp : bootTimestamp)
        {
            auto method = conn->new_method_call(
                kSystemdService.data(), kSystemdPath.data(),
                kSystemdIface.data(), kSystemdFunc.data());
            method.append(kSystemdParam1.data(), timestamp.first.data());
            std::variant<uint64_t> result;
            try
            {
                conn->call(method).read(result);
            }
            catch (const sdbusplus::exception::SdBusError& e)
            {
                fmt::print(
                    stderr,
                    "[checkBmcFinish] Can't get systemd property {}. ERROR={}\n",
                    timestamp.first.data(), e.what());
                // Restart the timer to keep polling the APML_ALERT status
                BmcFinishTimer.expires_after(kCheckBmcFinishInterval);
                BmcFinishTimer.async_wait(checkBmcFinish);
                return;
            }
            *timestamp.second = std::get<uint64_t>(result);
        }

        // This daemon may start before the userspace is fully ready. So we need
        // to confirm if userspace is fully ready by checking `times.finish`
        // equals zero or not.
        if (times.finish == 0)
        {
            fmt::print(
                stderr,
                "[checkBmcFinish] `FinishTimestampMonotonic` is not ready yet\n");
            BmcFinishTimer.expires_after(kCheckBmcFinishInterval);
            BmcFinishTimer.async_wait(checkBmcFinish);
            return;
        }

        // How to calculate duration for each stage:
        // https://github.com/systemd/systemd/blob/82b7bf8c1c8c6ded6f56b43998c803843a3b944b/src/analyze/analyze-time-data.c#L176-L186
        // Special calculation for kernel duration:
        // https://github.com/systemd/systemd/blob/82b7bf8c1c8c6ded6f56b43998c803843a3b944b/src/analyze/analyze-time-data.c#L84-L87
        bootManager->setDuration(convertName(kSystemdFirmwareTime),
                                 times.firmware != 0
                                     ? (times.firmware - times.loader) /
                                           kMillisecondPerSecond
                                     : 0);
        bootManager->setDuration(
            convertName(kSystemdLoaderTime),
            times.loader != 0 ? times.loader / kMillisecondPerSecond : 0);
        bootManager->setDuration(
            convertName(kSystemdKernelTime),
            (times.initRD > 0 ? times.initRD : times.userspace) /
                kMillisecondPerSecond);
        bootManager->setDuration(convertName(kSystemdInitRDTime),
                                 times.initRD != 0
                                     ? (times.userspace - times.initRD) /
                                           kMillisecondPerSecond
                                     : 0);
        bootManager->setDuration(convertName(kSystemdUserspaceTime),
                                 times.userspace != 0
                                     ? (times.finish - times.userspace) /
                                           kMillisecondPerSecond
                                     : 0);

#ifdef NPCM7XX_OR_NEWER
        // NPCM7XX or newer Nuvoton BMC has a register that starts counting from
        // SoC power on. Also uptime starts counting when kernel is up. Thus we
        // can get (Firmware + Loader) time by `value[SEC_CNT_ADDR] - uptime`.
        constexpr uint32_t SEC_CNT_ADDR = 0xF0801068;

        auto powerOnSec = util->readMem4Bytes(SEC_CNT_ADDR);
        auto upTimeMS = util->getUpTimeInMs();
        if (powerOnSec != std::nullopt && upTimeMS != std::nullopt)
        {
            bootManager->setDuration("FirmwarePlusLoader",
                                     powerOnSec.value() * 1000 -
                                         upTimeMS.value());
        }
#endif

// BMC marks the boot process as `completed` automatically if we do *NOT* have
// external daemon to do so.
#ifdef AUTO_BMC_COMPLETE
        bootManager->setCheckpoint("UserspaceEnd", 0, 0);
        bootManager->notifyComplete();
#endif
    };
    BmcFinishTimer.expires_after(std::chrono::seconds(0));
    BmcFinishTimer.async_wait(checkBmcFinish);
}

} // namespace boot_time_monitor
