#pragma once
/*
 * Created by Brett on 16/12/23.
 * Licensed under GNU General Public License V3.0
 * See LICENSE file for license detail
 */

#ifndef BLT_GL_INCLUDES_H
#define BLT_GL_INCLUDES_H

#include <blt/logging/logging.h>

// emscripten provides its own gl bindings.
#ifndef __EMSCRIPTEN__
    
    #include <glad/gl.h>

#else
    #include <GLES2/gl2.h>
    #include <GLES3/gl3.h>
    #include <GLES3/gl31.h>
    #include <GLES3/gl32.h>
    #include <emscripten.h>
    #define GL_GLEXT_PROTOTYPES
    #define EGL_EGLEXT_PROTOTYPES
#endif

namespace blt::gfx
{
    inline std::string get_error_message(GLenum error)
    {
        switch (error)
        {
            case GL_INVALID_ENUM:
                return "Invalid Enum";
            case GL_INVALID_VALUE:
                return "Invalid Value";
            case GL_INVALID_OPERATION:
                return "Invalid Operation";
            case GL_STACK_OVERFLOW:
                return "Stack Overflow";
            case GL_STACK_UNDERFLOW:
                return "Stack Underflow";
            case GL_OUT_OF_MEMORY:
                return "Out Of Memory";
            case GL_INVALID_FRAMEBUFFER_OPERATION:
                return "Invalid Framebuffer Operation";
            case GL_INVALID_INDEX:
                return "Invalid Index";
        }
        return std::string("Unknown Error: ") += std::to_string(error);
    }
    
    inline void handle_errors()
    {
        GLenum err;
        while ((err = glGetError()) != GL_NO_ERROR)
        {
            BLT_ERROR(get_error_message(err));
        }
    }
}

#endif //BLT_GL_INCLUDES_H