#include "systemd_handler.hpp"

#include "log.hpp" // provide btm::log::LogIfError

#include <fmt/printf.h>

#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>

#include <fstream>
#include <regex>

namespace boot_time_monitor
{
namespace systemd
{

namespace btm = boot_time_monitor;

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 SystemdTimestamps
{
    uint64_t firmware = 0;
    uint64_t loader = 0;
    uint64_t kernel = 0;
    uint64_t initRD = 0;
    uint64_t userspace = 0;
    uint64_t finish = 0;
};

// Support negative duration if needed.
struct SystemdDurations
{
    int64_t firmware = 0;
    int64_t loader = 0;
    int64_t kernel = 0;
    int64_t initRD = 0;
    int64_t userspace = 0;
};

namespace
{
// --- Helper Functions ---

/**
 * @brief Calculates boot stage durations from systemd timestamps.
 * @param times A struct containing all collected monotonic timestamps.
 * @return A struct containing the calculated duration for each stage in ms.
 *
 * The calculation logic is based on systemd-analyze:
 * 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
 */
SystemdDurations CalculateSystemdDuration(const SystemdTimestamps& times)
{
    // Durations are calculated by subtracting the start times of subsequent
    // stages. Cast to signed to prevent underflow if timestamps are out of
    // order.
    auto to_ms = [](int64_t us) { return us > 0 ? us / 1000 : 0; };

    int64_t firmware_us = static_cast<int64_t>(times.firmware);
    int64_t loader_us = static_cast<int64_t>(times.loader);
    int64_t initRD_us = static_cast<int64_t>(times.initRD);
    int64_t userspace_us = static_cast<int64_t>(times.userspace);
    int64_t finish_us = static_cast<int64_t>(times.finish);

    SystemdDurations durations;
    durations.firmware = to_ms(firmware_us - loader_us);
    durations.loader = to_ms(loader_us);
    // Kernel time ends when initrd is done, or when userspace starts if no
    // initrd.
    durations.kernel = (initRD_us > 0) ? to_ms(initRD_us) : to_ms(userspace_us);
    durations.initRD = (initRD_us > 0) ? to_ms(userspace_us - initRD_us) : 0;
    durations.userspace = to_ms(finish_us - userspace_us);

    return durations;
}

/**
 * @brief Removes the "TimestampMonotonic" suffix from a property name.
 * @param name The full D-Bus property name.
 * @return The base name for the boot stage.
 */
std::string GetStageName(std::string_view name)
{
    constexpr std::string_view suffix = "TimestampMonotonic";
    if (name.ends_with(suffix))
    {
        name.remove_suffix(suffix.length());
    }
    return std::string(name);
}

} // namespace

// --- Class Implementation ---

Handler::Handler(std::shared_ptr<sdbusplus::asio::connection> conn,
                 std::shared_ptr<btm::api::IBoottimeApi> api,
                 btm::NodeConfig bmcNode) :
    mApi(std::move(api)), mBMCFinishTimer(conn->get_io_context()),
    mDbusConn(std::move(conn)), mNode(std::move(bmcNode))
{
    // On startup, check if the system has already finished booting.
    if (auto finishTime = QuerySystemdTimestamp(kSystemdFinishTime);
        finishTime && *finishTime > 0)
    {
        // If the system is booted, ensure any pending reboot state is cleared.
        if (mApi->IsNodeRebooting(mNode))
        {
            fmt::print(stderr,
                       "'{}' is already booted; marking reboot as complete.\n",
                       mNode.node_name);
            btm::log::LogIfError(mApi->NotifyNodeComplete(mNode));
        }
        else
        {
            fmt::print(stderr, "'{}' is already booted.\n", mNode.node_name);
        }
        return;
    }

    // If not booted, start polling for boot completion.
    fmt::print(
        stderr,
        "BMC is not yet fully booted. Waiting for systemd to finish...\n");
    mBMCFinishTimer.expires_at(std::chrono::steady_clock::now());
    mBMCFinishTimer.async_wait(
        [this](const auto& ec) { UpdateBmcCheckpoints(ec); });
}

std::optional<uint64_t>
    Handler::QuerySystemdTimestamp(std::string_view propertyName)
{
    auto method = mDbusConn->new_method_call(
        "org.freedesktop.systemd1",        // Systemd Service
        "/org/freedesktop/systemd1",       // Systemd Path
        "org.freedesktop.DBus.Properties", // Systemd Iface
        "Get");                            // Systemd Func
    method.append("org.freedesktop.systemd1.Manager", propertyName);

    try
    {
        auto reply = mDbusConn->call(method);
        std::variant<uint64_t> result;
        reply.read(result);
        return std::get<uint64_t>(result);
    }
    catch (const sdbusplus::exception::SdBusError& e)
    {
        fmt::print(stderr, "Failed to get systemd property '{}': {}\n",
                   propertyName, e.what());
        return std::nullopt;
    }
}

void Handler::RestartPolling()
{
    mBMCFinishTimer.expires_after(kCheckBmcFinishInterval);
    mBMCFinishTimer.async_wait(
        [this](const auto& ec) { UpdateBmcCheckpoints(ec); });
}

void Handler::UpdateBmcCheckpoints(const boost::system::error_code& ec)
{
    if (ec)
    {
        if (ec != boost::asio::error::operation_aborted)
        {
            fmt::print(stderr, "BMC checkpoint timer error: {}\n",
                       ec.message());
        }
        return;
    }

    // 1. Check if systemd has finished booting. If not, poll again.
    std::optional<uint64_t> finishTimestamp =
        QuerySystemdTimestamp(kSystemdFinishTime);
    if (!finishTimestamp || *finishTimestamp == 0)
    {
        RestartPolling();
        return;
    }

    // 2. Systemd is ready. Query all other timestamps.
    SystemdTimestamps times;
    times.finish = *finishTimestamp;

    auto queryAndAssign = [&](const std::string_view name,
                              uint64_t& destination) -> bool {
        if (auto val = QuerySystemdTimestamp(name))
        {
            destination = *val;
            return true;
        }
        return false;
    };
    if (!queryAndAssign(kSystemdFirmwareTime, times.firmware))
    {
        RestartPolling();
        return;
    }
    if (!queryAndAssign(kSystemdLoaderTime, times.loader))
    {
        RestartPolling();
        return;
    }
    if (!queryAndAssign(kSystemdKernelTime, times.kernel))
    {
        RestartPolling();
        return;
    }
    if (!queryAndAssign(kSystemdInitRDTime, times.initRD))
    {
        RestartPolling();
        return;
    }
    if (!queryAndAssign(kSystemdUserspaceTime, times.userspace))
    {
        RestartPolling();
        return;
    }

    fmt::print(stderr, "Successfully collected all systemd boot timestamps.\n");

    // 3. All data is collected. Calculate and report the durations.
    SystemdDurations durationMap = CalculateSystemdDuration(times);

#ifdef NPCM7XX_OR_NEWER
    fmt::print(stderr, "NPCM7XX_OR_NEWER applied");
    // 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;
    if (auto powerOnSec = readMem4Bytes(SEC_CNT_ADDR); powerOnSec)
    {
        if (auto upTimeMS = getUpTimeInMs(); upTimeMS)
        {
            // This register provides a more accurate power-on to kernel-up
            // time.
            durationMap.firmware = (powerOnSec.value() * 1000) -
                                   upTimeMS.value();
            durationMap.loader = 0; // The combined time is stored in firmware.
        }
    }
#endif

    // 4. Report the calculated durations.
    btm::log::LogIfError(mApi->SetNodeDuration(
        mNode, GetStageName(kSystemdFirmwareTime), durationMap.firmware));
    btm::log::LogIfError(mApi->SetNodeDuration(
        mNode, GetStageName(kSystemdLoaderTime), durationMap.loader));
    btm::log::LogIfError(mApi->SetNodeDuration(
        mNode, GetStageName(kSystemdKernelTime), durationMap.kernel));
    btm::log::LogIfError(mApi->SetNodeDuration(
        mNode, GetStageName(kSystemdInitRDTime), durationMap.initRD));
    btm::log::LogIfError(mApi->SetNodeDuration(
        mNode, GetStageName(kSystemdUserspaceTime), durationMap.userspace));

    // 5. Finalize the boot process.
    btm::log::LogIfError(mApi->SetNodeCheckpoint(mNode, "UserspaceEnd", 0, 0));
    btm::log::LogIfError(mApi->NotifyNodeComplete(mNode));
}

#ifdef NPCM7XX_OR_NEWER
std::optional<uint32_t> Handler::readMem4Bytes(uint32_t target)
{
    // Typically the pageSize will be 4K/8K for 32 bit operating systems
    uint32_t pageSize = boost::interprocess::mapped_region::get_page_size();
    const uint32_t kPageMask = pageSize - 1;

    uint32_t pageOffset = target & (~kPageMask);
    uint32_t offsetInPage = target & kPageMask;

    // Map `/dev/mem` to a region.
    std::unique_ptr<boost::interprocess::file_mapping> fileMapping;
    std::unique_ptr<boost::interprocess::mapped_region> MappedRegion;
    try
    {
        fileMapping = std::make_unique<boost::interprocess::file_mapping>(
            "/dev/mem", boost::interprocess::read_only);
        // No need to unmap in the end.
        MappedRegion = std::make_unique<boost::interprocess::mapped_region>(
            *fileMapping, boost::interprocess::read_only, pageOffset,
            pageSize * 2);

        // MappedRegion->get_address() returns (void*) which needs to covert
        // into (char*) to make `+ offsetInPage` work.
        // Then converts it again into (uint32_t*) since we read 4 bytes.
        return *(reinterpret_cast<uint32_t*>(
            static_cast<char*>(MappedRegion->get_address()) + offsetInPage));
    }
    catch (const std::exception& e)
    {
        fmt::print(stderr, "Error reading /dev/mem at address {:#x}: {}\n",
                   target, e.what());
        return std::nullopt;
    }

    fmt::print(stderr, "[{}]: Shouldn't go to this line.\n", __FUNCTION__);
    return std::nullopt;
}

std::optional<int64_t> Handler::getUpTimeInMs()
{
    std::ifstream fin("/proc/uptime");
    if (!fin.is_open())
    {
        fmt::print(stderr,
                   "Failed to open /proc/uptime to read system uptime.\n");
        return std::nullopt;
    }
    double uptimeSec = 0.0;
    fin >> uptimeSec;
    if (fin.fail())
    {
        fmt::print(stderr,
                   "Failed to parse system uptime from /proc/uptime.\n");
        return std::nullopt;
    }

    return static_cast<int64_t>(uptimeSec * 1000);
}
#endif // NPCM7XX_OR_NEWER

} // namespace systemd
} // namespace boot_time_monitor
