#include "Engine.h"

Engine Engine::GetInstance() {
	return Instance;
}

Engine::Engine() {

}

Engine::~Engine() {
	// Unload all GraphicsDrivers
	for (auto iter = m_GraphicsDrivers.begin(); iter != m_GraphicsDrivers.end(); iter++) {
		UnloadGraphicsDriver(*iter);
	}
}

typedef GraphicsDriver*(__stdcall *GraphicsDriverInstance_t)();

GraphicsDriver* Engine::LoadGraphicsDriver(std::string libraryPath) {
	HINSTANCE lib = LoadLibrary(libraryPath.c_str());
	if (lib != NULL) {
		FARPROC fnGraphicsDriverInstance = GetProcAddress(lib, "GraphicsDriverInstance");
		if (fnGraphicsDriverInstance != NULL) {
			GraphicsDriver* graphicsDriver = ((GraphicsDriverInstance_t)fnGraphicsDriverInstance)();

			// Insert into list.
			m_GraphicsDrivers.emplace_back(graphicsDriver);
			m_GraphicsDrivers_MapToLibrary[graphicsDriver] = lib;

			return graphicsDriver;
		}
		FreeLibrary(lib);
	}

	// An error occured, handle it somehow here.
	MessageBox(0, "Not Yet Implemented", "Not Yet Implemented", 0);
	return nullptr;
}

void Engine::UnloadGraphicsDriver(GraphicsDriver* graphicsDriver) {

}
