#include "BarinkEngine.h"

EngineStatistics* ES;
BarinkEngine::InputManager InputSystem;

int main(int argc, char* argv[]) {
	// Setup performance sampler 
	PerfomanceSamplerInit();


	// Create the window 
	BarinkWindow MainWindow = BarinkWindow(800, 600);

	// =================================================
	// Startup services 
	// =================================================

	// Startup Renderer
	BarinkEngine::Renderer renderer = BarinkEngine::Renderer();
	

	// Startup InputManager
	InputSystem = BarinkEngine::InputManager();

	InputSystem.attach(&MainWindow);
	InputSystem.setupGLFWInput(MainWindow.windowptr());



	// Startup GUI System
	GUIManager GUISystem = GUIManager(&MainWindow);




	// Enable depth testing 
	// NOTE: TODO Move this into the renderer
	glEnable(GL_DEPTH_TEST);



	// First call to setup game
	Start();


	
	// Runtime loop
	while (!MainWindow.WindowShouldClose()) {

		SamplePerformance();


		// Execute main logic 
		InputSystem.PollEvents();
		
		Update();

		renderer.Render();

		ImmediateGraphicsDraw();

		GUISystem.Render();
		


		MainWindow.SwapBuffers();
	}


	// Shutdown game
	Stop();


	// Shutdown Services
	delete ES;
	InputSystem.detach(&MainWindow);
	


	return 0;
}

