#include <engine.hpp>

#include <config.hpp>
#include <world.hpp>
#include <ui.hpp>
#include <inventory.hpp>
#include <entities.hpp>
#include <window.hpp>

extern World *currentWorld;

Engine::Engine(void)
    : gameRunning(true), systems(game::entities, game::events)
{
}

void Engine::init(void) {
    game::config::read();
    game::events.subscribe<GameEndEvent>(*this);

    systems.add<WindowSystem>();
    systems.add<InputSystem>();
    systems.add<InventorySystem>();
    systems.add<WorldSystem>();
    systems.add<PlayerSystem>(&player);

    systems.configure();
}

void Engine::render(entityx::TimeDelta dt)
{
    systems.update<WindowSystem>(dt);
}

void Engine::update(entityx::TimeDelta dt)
{
    systems.update<InputSystem>(dt);
    systems.update<InventorySystem>(dt);
    systems.update<PlayerSystem>(dt);
	systems.update<WorldSystem>(dt);
}


namespace game {
	entityx::EventManager events;
	entityx::EntityManager entities (events);

    Engine engine;
}