#include "config.h"

#include "bios_handler.hpp"
#include "constants.hpp"
#include "event_logger.hpp"
#include "exceptions.hpp"
#include "logger.hpp"
#include "manager.hpp"
#include "types.hpp"

#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>

#include <iostream>

/**
 * @brief Main function for VPD parser application.
 */
int main(int, char**)
{
    try
    {
        auto io_con = std::make_shared<boost::asio::io_context>();
        auto connection =
            std::make_shared<sdbusplus::asio::connection>(*io_con);
        auto server = sdbusplus::asio::object_server(connection);

        std::shared_ptr<sdbusplus::asio::dbus_interface> interface =
            server.add_interface(OBJPATH, IFACE);

        std::shared_ptr<sdbusplus::asio::dbus_interface> progressInf =
            server.add_interface(OBJPATH,
                                 vpd::constants::vpdCollectionInterface);

        auto vpdManager = std::make_shared<vpd::Manager>(
            io_con, interface, progressInf, connection);

        // TODO: Take this under conditional compilation for IBM
        [[maybe_unused]] auto biosHandler =
            std::make_shared<vpd::BiosHandler<vpd::IbmBiosHandler>>(
                connection, vpdManager);

        interface->initialize();
        progressInf->initialize();

        vpd::logging::logMessage("Start VPD-Manager event loop");

        // Grab the bus name
        connection->request_name(BUSNAME);

        // Start event loop.
        io_con->run();

        exit(EXIT_SUCCESS);
    }
    catch (const std::exception& l_ex)
    {
        vpd::logging::logMessage("VPD-Manager service failed to start.");
        vpd::EventLogger::createSyncPel(
            vpd::EventLogger::getErrorType(l_ex),
            vpd::types::SeverityType::Critical, __FILE__, __FUNCTION__, 0,
            vpd::EventLogger::getErrorMsg(l_ex), std::nullopt, std::nullopt,
            std::nullopt, std::nullopt);
    }
    exit(EXIT_FAILURE);
}
