#pragma once

#include <extra2d/graphics/backends/opengl/gl_buffer.h>
#include <extra2d/graphics/backends/opengl/gl_texture.h>
#include <extra2d/graphics/batch/sprite_batch.h>
#include <extra2d/graphics/shader/shader_interface.h>

#include <array>
#include <glad/glad.h>
#include <vector>

namespace extra2d {

// ============================================================================
// OpenGL 精灵批处理渲染器
// 使用 batch/sprite_batch 作为后端无关的批处理层
// ============================================================================
class GLSpriteBatch {
public:
    GLSpriteBatch();
    ~GLSpriteBatch();

    // 初始化/关闭
    bool init();
    void shutdown();

    // 批处理生命周期
    void begin(const glm::mat4& viewProjection);
    void end();

    // 绘制单个精灵
    void draw(const Texture& texture, const SpriteData& data);

    // 批量绘制（用于文本渲染优化）
    void drawBatch(const Texture& texture, const std::vector<SpriteData>& sprites);

    // 获取绘制调用次数
    uint32_t getDrawCallCount() const { return drawCallCount_; }

private:
    // OpenGL 对象
    GLuint vao_;
    GLBuffer vbo_;  // 顶点缓冲区（动态）
    GLBuffer ebo_;  // 索引缓冲区（静态）

    // 后端无关的批处理层
    SpriteBatch batch_;

    // 批次管理
    struct Batch {
        const GLTexture* texture;
        size_t startVertex;
        size_t vertexCount;
    };
    std::vector<Batch> batches_;
    const GLTexture* currentTexture_;

    // 着色器和矩阵
    Ptr<IShader> shader_;
    uint32_t drawCallCount_;
    glm::mat4 viewProjection_;

    // 内部方法
    void flush();
    void submitBatch();
};

} // namespace extra2d
