#pragma once
#include "boottime_api/node_config.h"

#include "dbus_handler.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 D-Bus configuration for a specific host.
 *
 * This function constructs the necessary D-Bus service names and object paths
 * for the phosphor-state-manager (PSM) based on a host's numerical index.
 * This configuration is used to monitor host state and OS status changes.
 *
 * @param idx The zero-based index of the host.
 * @return psm::PSMConfig The generated PSM configuration.
 */
inline psm::PSMConfig GenPSMConfig(int idx)
{
    std::vector<btm::psm::DbusServiceLocation> possibleOsStatus = {
        // New multi host nodes style.
        {"xyz.openbmc_project.State.OperatingSystem",
         fmt::format("/xyz/openbmc_project/state/host{}", idx)},
        // Old multi host nodes style.
        {fmt::format("xyz.openbmc_project.State.OperatingSystem{}", idx),
         "/xyz/openbmc_project/state/os"},
    };
    if (idx == 0)
    {
        // Legacy style is only valid if idx == 0. Do not try this interface
        // on other host nodes.
        possibleOsStatus.push_back({"xyz.openbmc_project.State.OperatingSystem",
                                    "/xyz/openbmc_project/state/os"});
    }
    return {
        .hostState = {fmt::format("xyz.openbmc_project.State.Host{}", idx),
                      fmt::format("/xyz/openbmc_project/state/host{}", idx)},
        .possibleOsStatus = possibleOsStatus,
    };
}

/**
 * @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.
 */
inline dbus::DbusConfig GenDbusConfig(const btm::NodeConfig& nodeConfig)
{
    return {.dbusObjPath = fmt::format("/xyz/openbmc_project/time/boot/{}",
                                       nodeConfig.node_name)};
}

/**
 * @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").
 */
inline 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).
 */
inline std::string GenBmcNodeName(int64_t bmcAmount, int idx)
{
    if (bmcAmount == 1)
    {
        return "bmc";
    }

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

} // namespace gen
} // namespace boot_time_monitor
