#include <iostream>

#include "server/commands/CommandTypes.h"
#include "server/GameServer.h"
#include "server/commands/CommandManager.h"

GameServer::GameServer() : reader(0, "> ") {
}

void GameServer::tick() {
    tps.update();
    handleCommands();
}

void GameServer::handleCommands() {
    if(!reader.canRead()) {
        return;
    }
    const char* s = reader.readLine();
    if(s == nullptr) {
        return;
    }
    RawCommand rawCommand(s);
    commandManager.execute(state, rawCommand);
}

void GameServer::onFullServerClientConnect(Client& client) {
    (void) client;
    std::cout << "full\n";
}

void GameServer::onClientConnect(Client& client) {
    (void) client;
    std::cout << "connected\n";
}

void GameServer::onClientPackage(Client& client, Packet& packet) {
    (void) client;
    StringBuffer<256> s;
    while(packet.hasData()) {
        s.append(packet.read8());
    }
    std::cout << "Packet: " << s << "\n";
}

void GameServer::onClientDisconnect(Client& client) {
    (void) client;
    std::cout << "disconnected\n";
}

bool GameServer::isRunning() const {
    return state.running;
}