#pragma once

#include "dbus_handler.hpp"
#include "node_config.hpp"
#include "psm_handler.hpp"

#include <fmt/printf.h>

#include <string_view>
#include <vector>

namespace boot_time_monitor
{
/**
 * @brief Contains helper functions for generating configuration objects and
 * names.
 *
 * This namespace provides utility functions to create configuration structures
 * (like PSMConfig and DbusConfig) and standardized node names based on system
 * properties like the number of hosts or BMCs and their indices.
 */
namespace gen
{
namespace btm = boot_time_monitor;

/**
 * @brief Generates the PSM (Platform State Manager) configuration for a
 * specific node.
 *
 * This function determines the correct D-Bus service names and object paths
 * for monitoring host state and OS status based on whether the system is
 * single-host or multi-host. For multi-host systems, it uses the node's
 * index within the provided list to construct unique identifiers.
 *
 * @param nodeConfigs A vector containing the configurations of all nodes.
 * @param nodeConfig The configuration of the specific node for which to
 * generate the PSM config.
 * @return psm::PSMConfig The generated PSM configuration containing D-Bus
 *                        service names and object paths. Returns an empty
 *                        config if the node is not found or the list is empty.
 */
psm::PSMConfig GenPSMConfig(const std::vector<btm::NodeConfig>& nodeConfigs,
                            const btm::NodeConfig& nodeConfig)
{
    if (nodeConfigs.size() == 0)
    {
        fmt::print("[{}] node list is empty!\n", __FUNCTION__);
        return {};
    }

    // Singlehost rule
    if (nodeConfigs.size() == 1)
    {
        return {
            .hostStateDbusService = "xyz.openbmc_project.State.Host",
            .hostStateDbusObjPath = "/xyz/openbmc_project/state/host0",
            .osStateDbusService = "xyz.openbmc_project.State.OperatingSystem",
            .osStateDbusObjPath = "/xyz/openbmc_project/state/os",
        };
    }

    // Multihost platforms have a different PSM Dbus Service and Path rule.
    // Create dBus path depends on its relative indices.
    auto it = std::find(nodeConfigs.begin(), nodeConfigs.end(), nodeConfig);
    if (it == nodeConfigs.end())
    {
        fmt::print("[{}] node config not found!\n", __FUNCTION__);
        return {};
    }

    int idx = std::distance(nodeConfigs.begin(), it) + 1;

    return {
        .hostStateDbusService = fmt::format("xyz.openbmc_project.State.Host{}",
                                            idx),
        .hostStateDbusObjPath = fmt::format("/xyz/openbmc_project/state/host{}",
                                            idx),
        .osStateDbusService =
            fmt::format("xyz.openbmc_project.State.OperatingSystem{}", idx),
        .osStateDbusObjPath = "/xyz/openbmc_project/state/os",
    };
}

/**
 * @brief Generates the D-Bus configuration for a specific node.
 *
 * Constructs the D-Bus object path for the boot time monitor interfaces
 * based on the node's name.
 *
 * @param nodeConfig The configuration of the node.
 * @return dbus::DbusConfig The generated D-Bus configuration containing the
 *                          object path.
 */
dbus::DbusConfig GenDbusConfig(const NodeConfig& nodeConfig)
{
    return {.dbusObjPath = fmt::format("/xyz/openbmc_project/time/boot/{}",
                                       nodeConfig.nodeName)};
}

/**
 * @brief Generates a standard host node name based on its index.
 *
 * @param idx The zero-based index of the host.
 * @return std::string The generated host node name (e.g., "host0", "host1").
 */
std::string GenHostNodeName(int idx)
{
    return fmt::format("host{}", idx);
}

/**
 * @brief Generates a standard BMC node name based on the total number of BMCs
 * and its index.
 * @param bmcAmount The total number of BMCs in the system.
 * @param idx The zero-based index of this BMC.
 * @return std::string The generated BMC node name (e.g., "bmc" for single BMC,
 * "bmc0", "bmc1" for multiple).
 */
std::string GenBmcNodeName(int bmcAmount, int idx)
{
    if (bmcAmount == 1)
        return "bmc";

    return fmt::format("bmc{}", idx);
}

} // namespace gen
} // namespace boot_time_monitor
