/**
 * \file main.cpp
 * \brief Univerxel game
 * \author Shu
 * \version 0.0.2
 *
 * Univerxel main program.
 */

#include "client/Client.hpp"
#include "server/Server.hpp"
#include "client/srvContainer.hpp"
#include "core/options_full.hpp"
#include "core/utils/tracy.hpp"
#include "core/utils/logger.hpp"
#include "version.h"


/// Entry point
int main(int argc, char *argv[]){
    LOG("Univerxel " << UNIVERXEL_VERSION);

#if TRACY_ENABLE
    LOG("Profiling !");
#endif

    auto options = config::options(argc > 1 ? argv[1] : config::DEFAULT_FILE);
    options.save();

    world::module::Registry::Load();

    if (options.hasClient()) {
#if TRACY_ENABLE
        tracy::SetThreadName("Client");
#endif
        ServerFactory* srvContainer = options.hasServer() ?
            new ServerFactory(options.getServer()) : nullptr;

        auto client = Client(options.getClient(), srvContainer);
        client.run();

        delete srvContainer;
    } else if (options.hasServer()) {
#if TRACY_ENABLE
        tracy::SetThreadName("Server");
#endif
        LOG_I("Running only server");
        auto server = Server(options.getServer());
        server.run();
    } else {
        FATAL("Nothing to start");
    }

    options.save();
    world::module::Registry::Unload();

    options.save();

    return 0;
}