#pragma once

#include <glad/glad.h>
#include <cstdint>
#include <string>

namespace extra2d {

// ============================================================================
// OpenGL 版本信息
// ============================================================================
struct GLVersion {
    int major = 0;
    int minor = 0;
    bool es = false;  // 是否为 ES 版本
};

// ============================================================================
// OpenGL 上下文管理类
// ============================================================================
class GLContext {
public:
    /**
     * @brief 获取全局 GLContext 实例
     */
    static GLContext& get();

    /**
     * @brief 初始化 OpenGL 上下文
     * @return 成功返回 true
     */
    bool init();

    /**
     * @brief 关闭 OpenGL 上下文
     */
    void shutdown();

    /**
     * @brief 检查上下文是否有效
     * @return 有效返回 true
     */
    bool isValid() const { return initialized_; }

    /**
     * @brief 获取 OpenGL 版本信息
     */
    const GLVersion& getVersion() const { return version_; }

    /**
     * @brief 获取 OpenGL 版本字符串
     */
    std::string getVersionString() const;

    /**
     * @brief 获取 GPU 厂商信息
     */
    std::string getVendor() const;

    /**
     * @brief 获取 GPU 渲染器信息
     */
    std::string getRenderer() const;

    /**
     * @brief 检查是否支持指定扩展
     * @param extension 扩展名称
     * @return 支持返回 true
     */
    bool hasExtension(const std::string& extension) const;

    /**
     * @brief 获取最大纹理尺寸
     */
    int getMaxTextureSize() const;

    /**
     * @brief 获取最大纹理单元数
     */
    int getMaxTextureUnits() const;

    /**
     * @brief 获取最大顶点属性数
     */
    int getMaxVertexAttribs() const;

    /**
     * @brief 获取最大 uniform 缓冲区绑定点数
     */
    int getMaxUniformBufferBindings() const;

    /**
     * @brief 检查是否为 OpenGL ES
     */
    bool isGLES() const { return version_.es; }

    /**
     * @brief 检查是否支持 VAO
     */
    bool hasVAO() const;

    /**
     * @brief 检查是否支持 FBO
     */
    bool hasFBO() const;

    /**
     * @brief 检查是否支持 Shader
     */
    bool hasShader() const;

private:
    GLContext() = default;
    ~GLContext() = default;

    GLContext(const GLContext&) = delete;
    GLContext& operator=(const GLContext&) = delete;

    bool initialized_ = false;
    GLVersion version_;

    // 缓存的限制值
    mutable int maxTextureSize_ = -1;
    mutable int maxTextureUnits_ = -1;
    mutable int maxVertexAttribs_ = -1;
    mutable int maxUniformBufferBindings_ = -1;

    /**
     * @brief 解析 OpenGL 版本
     */
    void parseVersion();

    /**
     * @brief 加载 OpenGL 扩展
     */
    bool loadExtensions();
};

} // namespace extra2d
