#pragma once

#include <extra2d/core/color.h>
#include <extra2d/core/math_types.h>
#include <extra2d/core/types.h>
#include <glm/mat4x4.hpp>
#include <cstdint>
#include <vector>

namespace extra2d {

// ============================================================================
// 形状顶点结构
// ============================================================================
struct ShapeVertex {
    float x, y;         // 位置
    float r, g, b, a;   // 颜色

    ShapeVertex() = default;
    ShapeVertex(float px, float py, const Color& c)
        : x(px), y(py), r(c.r), g(c.g), b(c.b), a(c.a) {}
};

// ============================================================================
// 形状批处理抽象接口 - 后端无关
// ============================================================================
class ShapeBatch {
public:
    virtual ~ShapeBatch() = default;

    /**
     * @brief 初始化形状批处理
     * @return 成功返回 true
     */
    virtual bool init() = 0;

    /**
     * @brief 关闭形状批处理，释放资源
     */
    virtual void shutdown() = 0;

    /**
     * @brief 开始批处理
     * @param viewProjection 视图投影矩阵
     */
    virtual void begin(const glm::mat4& viewProjection) = 0;

    /**
     * @brief 结束批处理并提交绘制
     */
    virtual void end() = 0;

    /**
     * @brief 绘制线段
     * @param start 起点
     * @param end 终点
     * @param color 颜色
     * @param width 线宽
     */
    virtual void drawLine(const Vec2& start, const Vec2& end, 
                          const Color& color, float width = 1.0f) = 0;

    /**
     * @brief 绘制矩形边框
     * @param rect 矩形区域
     * @param color 颜色
     * @param width 边框宽度
     */
    virtual void drawRect(const Rect& rect, const Color& color, 
                          float width = 1.0f) = 0;

    /**
     * @brief 填充矩形
     * @param rect 矩形区域
     * @param color 颜色
     */
    virtual void fillRect(const Rect& rect, const Color& color) = 0;

    /**
     * @brief 绘制圆形边框
     * @param center 圆心
     * @param radius 半径
     * @param color 颜色
     * @param segments 分段数
     * @param width 边框宽度
     */
    virtual void drawCircle(const Vec2& center, float radius, 
                            const Color& color, int segments = 32, 
                            float width = 1.0f) = 0;

    /**
     * @brief 填充圆形
     * @param center 圆心
     * @param radius 半径
     * @param color 颜色
     * @param segments 分段数
     */
    virtual void fillCircle(const Vec2& center, float radius, 
                            const Color& color, int segments = 32) = 0;

    /**
     * @brief 绘制三角形边框
     * @param p1 顶点1
     * @param p2 顶点2
     * @param p3 顶点3
     * @param color 颜色
     * @param width 边框宽度
     */
    virtual void drawTriangle(const Vec2& p1, const Vec2& p2, const Vec2& p3,
                              const Color& color, float width = 1.0f) = 0;

    /**
     * @brief 填充三角形
     * @param p1 顶点1
     * @param p2 顶点2
     * @param p3 顶点3
     * @param color 颜色
     */
    virtual void fillTriangle(const Vec2& p1, const Vec2& p2, const Vec2& p3,
                              const Color& color) = 0;

    /**
     * @brief 绘制多边形边框
     * @param points 顶点数组
     * @param color 颜色
     * @param width 边框宽度
     */
    virtual void drawPolygon(const std::vector<Vec2>& points, 
                             const Color& color, float width = 1.0f) = 0;

    /**
     * @brief 填充多边形
     * @param points 顶点数组
     * @param color 颜色
     */
    virtual void fillPolygon(const std::vector<Vec2>& points, 
                             const Color& color) = 0;

    /**
     * @brief 获取绘制调用次数
     * @return 绘制调用次数
     */
    virtual uint32_t getDrawCallCount() const = 0;

    /**
     * @brief 重置绘制调用计数
     */
    virtual void resetDrawCallCount() = 0;

    /**
     * @brief 检查是否有效
     * @return 有效返回 true
     */
    virtual bool isValid() const = 0;
};

} // namespace extra2d
