#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[])
{
    int hostCount = 1; // Default host count
    int 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::atoi(optarg);
                break;
            case 'b':
                bmcCount = std::atoi(optarg);
                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>();

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

    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;
}
