#include "api.hpp"
#include "dbus_handler.hpp"
#include "gen.hpp"
#include "psm_handler.hpp"
#include "systemd_handler.hpp"

#include <fmt/printf.h>
#include <getopt.h> // For getopt_long

#include <boost/asio/io_service.hpp>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/bus.hpp>
#include <sdbusplus/server.hpp>

namespace btm = boot_time_monitor;

/*
 *  +-----------------+
 *  |      main       |
 *  +-----------------+
 *        |
 *        |
 *        v
 *  +-----------------+
 *  |   data_sources  |
 *  +-----------------+
 *        |   |   |
 *        |   |   psm_handler
 *        |   dbus_handler
 *        systemd_handler
 *        |
 *        | interface between data source and actual checkpoint/duration records
 *        v
 *  +-----------------+
 *  |      api        |
 *  +-----------------+
 *        |
 *        | store checkpoints/durations
 *        v
 *  +-----------------+
 *  |     files       |
 *  +-----------------+
 *
 */

void print_usage(const char* prog_name)
{
    fmt::print(stderr, "Usage: {} [options]\n", prog_name);
    fmt::print(stderr, "Options:\n");
    fmt::print(stderr,
               "  -h, --help             Show this help message and exit\n");
    fmt::print(stderr,
               "  --host_count <num>    Set number of hosts (default: 1)\n");
    fmt::print(stderr,
               "  --bmc_count <num>     Set number of BMCs (default: 1)\n");
}

int main(int argc, char* argv[])
{
    int64_t hostCount = 1; // Default host count
    int64_t bmcCount = 1;  // Default BMC count

    const struct option long_options[] = {
        {"help", no_argument, nullptr, 'h'},
        {"host_count", required_argument, nullptr, 'o'}, // 'o' for hOst
        {"bmc_count", required_argument, nullptr, 'b'},  // 'b' for Bmc
        {nullptr, 0, nullptr, 0}};

    int opt;
    int option_index = 0;
    while ((opt = getopt_long(argc, argv, "h", long_options, &option_index)) !=
           -1)
    {
        switch (opt)
        {
            case 'h':
                print_usage(argv[0]);
                return 0;
            case 'o':
                hostCount = std::strtol(optarg, nullptr, 10);
                break;
            case 'b':
                bmcCount = std::strtol(optarg, nullptr, 10);
                break;
            default: /* '?' */
                print_usage(argv[0]);
                return 1;
        }
    }

    boost::asio::io_service io;
    auto conn = std::make_shared<sdbusplus::asio::connection>(io);
    conn->request_name("com.google.gbmc.boot_time_monitor");
    auto server = std::make_shared<sdbusplus::asio::object_server>(conn);
    auto& bus = static_cast<sdbusplus::bus::bus&>(*conn);

    std::vector<btm::NodeConfig> hostNodeConfigs;
    std::vector<btm::NodeConfig> bmcNodeConfigs;

    std::vector<std::unique_ptr<btm::dbus::Handler>> hostDbusHandlers;
    std::vector<std::unique_ptr<btm::dbus::Handler>> bmcDbusHandlers;

    std::vector<btm::psm::Handler> psmHandlers;

    std::shared_ptr<btm::api::Api> api = std::make_shared<btm::api::Api>();

    hostNodeConfigs.reserve(hostCount);
    for (int i = 0; i < hostCount; i++)
    {
        hostNodeConfigs.emplace_back(btm::gen::GenHostNodeName(i),
                                     std::string(btm::kBootTimeTagHost));
    }

    bmcNodeConfigs.reserve(bmcCount);
    for (int i = 0; i < bmcCount; i++)
    {
        bmcNodeConfigs.emplace_back(btm::gen::GenBmcNodeName(bmcCount, i),
                                    std::string(btm::kBootTimeTagBMC));
    }

    for (auto& nodeConfig : hostNodeConfigs)
    {
        api->RegisterNode(nodeConfig);

        hostDbusHandlers.emplace_back(std::make_unique<btm::dbus::Handler>(
            bus, nodeConfig, btm::gen::GenDbusConfig(nodeConfig), api));
        psmHandlers.emplace_back(
            bus, nodeConfig,
            btm::gen::GenPSMConfig(hostNodeConfigs, nodeConfig), api);
    }

    for (auto& nodeConfig : bmcNodeConfigs)
    {
        api->RegisterNode(nodeConfig);

        bmcDbusHandlers.emplace_back(std::make_unique<btm::dbus::Handler>(
            bus, nodeConfig, btm::gen::GenDbusConfig(nodeConfig), api));
    }

    btm::systemd::Handler systemdHandler(conn, api);

    io.run();

    return 0;
}
