#include "server/network/Server.h"
#include "server/GameServer.h"
#include "server/Clock.h"

static const u64 NANOS_PER_TICK = 50000000;

int main() {
    Socket listener;
    if(listener.hasError() || listener.setNonLinger() || listener.listenOnPort(25565, 5)) {
        return 0;
    }
    Clock tps;
    GameServer gameServer(tps);
    Server server(listener, 20, gameServer);
    ServerCommands serverCommands;
    CommandEditor editor;
    
    Clock clock;
    u64 lag = 0;
    while(serverCommands.isRunning()) {
        lag += clock.update();
        while(lag >= NANOS_PER_TICK) {
            lag -= NANOS_PER_TICK;
            tps.update();
            editor.preTick();
            gameServer.handleCommands(editor, serverCommands);
            gameServer.tick();
            editor.postTick();
        }
        u64 waitNanos = NANOS_PER_TICK - lag;
        if(waitNanos > 300000) {
            clock.wait(waitNanos);
        }
    }
    return 0;
}