#include 
#include  // required for forward declaratio>
#include  // required for forward declaratio>
#include 
#include  // required for forward declaratio>
#include        // required for forward declaratio>
namespace lt {
glGraphicsContext::glGraphicsContext()
{
	m_graphics_api = GraphicsAPI::OpenGL;
	set_debug_message_callback();
}
void glGraphicsContext::log_debug_data()
{
	log_inf("________________________________________");
	log_inf("GraphicsContext::");
	log_inf("        API     : OpenGL");
	log_inf("________________________________________");
}
void glGraphicsContext::set_debug_message_callback()
{
	// determine log level
	// #todo: set filters from config.h
#if defined(LIGHT_DEBUG)
	glEnable(GL_DEBUG_OUTPUT);
	glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
	GLuint ids[] = { 131185 };
	glDebugMessageControl(
	    GL_DEBUG_SOURCE_API,
	    GL_DEBUG_TYPE_OTHER,
	    GL_DONT_CARE,
	    _countof(ids),
	    ids,
	    GL_FALSE
	);
#elif defined(LIGHT_RELEASE)
	glEnable(GL_DEBUG_OUTPUT);
	glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_FALSE);
	glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, nullptr, GL_TRUE);
	glDebugMessageControl(
	    GL_DONT_CARE,
	    GL_DONT_CARE,
	    GL_DEBUG_SEVERITY_MEDIUM,
	    0,
	    nullptr,
	    GL_TRUE
	);
#else // LIGHT_DIST
	return;
#endif
	/* setup message callback */
	glDebugMessageCallback(
	    [](unsigned int source,
	       unsigned int type,
	       unsigned int id,
	       unsigned int severity,
	       int /*length*/,
	       const char *message,
	       const void * /*userParam*/) {
		    switch (severity)
		    {
		    case GL_DEBUG_SEVERITY_HIGH:
			    // TODO(Light): Add gl exception class
			    throw std::runtime_error { "gl exception" };
			    return;
		    case GL_DEBUG_SEVERITY_MEDIUM:
		    case GL_DEBUG_SEVERITY_LOW:
			    log_wrn(
			        "glMessageCallback: Severity: {} :: Source: {} :: Type: {} :: ID: {}",
			        // TODO(Light): Stringify!
			        severity,
			        source,
			        type,
			        id
			    );
			    log_wrn("      {}", message);
			    return;
		    case GL_DEBUG_SEVERITY_NOTIFICATION:
			    log_wrn(
			        "Severity: {} :: Source: {} :: Type: {} :: ID: {}",
			        // TODO(Light): Stringify!
			        severity,
			        source,
			        type,
			        id
			    );
			    log_trc("        {}", message);
			    return;
		    }
	    },
	    nullptr
	);
}
} // namespace lt