#pragma once

#include <extra2d/core/color.h>
#include <extra2d/core/types.h>
#include <extra2d/graphics/texture/texture.h>
#include <cstdint>

namespace extra2d {

// ============================================================================
// 帧缓冲描述结构
// ============================================================================
struct FramebufferDesc {
    int width = 0;              // 帧缓冲宽度
    int height = 0;             // 帧缓冲高度
    int colorAttachments = 1;   // 颜色附件数量
    bool hasDepth = false;      // 是否有深度附件
    bool hasStencil = false;    // 是否有模板附件
    bool multisample = false;   // 是否多重采样
    int samples = 4;            // 采样数（多重采样时有效）
};

// ============================================================================
// 帧缓冲抽象接口 - 渲染后端无关
// ============================================================================
class Framebuffer {
public:
    virtual ~Framebuffer() = default;

    /**
     * @brief 绑定帧缓冲（作为渲染目标）
     */
    virtual void bind() = 0;

    /**
     * @brief 解绑帧缓冲（恢复到默认帧缓冲）
     */
    virtual void unbind() = 0;

    /**
     * @brief 附加颜色纹理
     * @param texture 纹理对象
     * @param attachment 附件索引（0-7）
     */
    virtual void attachColorTexture(Ptr<Texture> texture, int attachment = 0) = 0;

    /**
     * @brief 附加深度纹理
     * @param texture 纹理对象
     */
    virtual void attachDepthTexture(Ptr<Texture> texture) = 0;

    /**
     * @brief 附加深度模板纹理
     * @param texture 纹理对象
     */
    virtual void attachDepthStencilTexture(Ptr<Texture> texture) = 0;

    /**
     * @brief 检查帧缓冲是否完整
     * @return 完整返回 true
     */
    virtual bool isComplete() = 0;

    /**
     * @brief 获取颜色附件纹理
     * @param attachment 附件索引
     * @return 纹理对象
     */
    virtual Ptr<Texture> getColorTexture(int attachment = 0) const = 0;

    /**
     * @brief 获取深度附件纹理
     * @return 纹理对象
     */
    virtual Ptr<Texture> getDepthTexture() const = 0;

    /**
     * @brief 获取帧缓冲宽度
     * @return 宽度
     */
    virtual int getWidth() const = 0;

    /**
     * @brief 获取帧缓冲高度
     * @return 高度
     */
    virtual int getHeight() const = 0;

    /**
     * @brief 获取尺寸
     * @return 尺寸
     */
    virtual Size getSize() const = 0;

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

    /**
     * @brief 获取原生句柄（后端特定）
     * @return 原生句柄值
     */
    virtual uintptr_t getNativeHandle() const = 0;

    /**
     * @brief 清除帧缓冲
     * @param color 清除颜色
     * @param clearColor 是否清除颜色缓冲
     * @param clearDepth 是否清除深度缓冲
     * @param clearStencil 是否清除模板缓冲
     */
    virtual void clear(const Color& color, bool clearColor = true, 
                       bool clearDepth = true, bool clearStencil = false) = 0;

    /**
     * @brief 设置视口
     * @param x 视口左下角X坐标
     * @param y 视口左下角Y坐标
     * @param width 视口宽度
     * @param height 视口高度
     */
    virtual void setViewport(int x, int y, int width, int height) = 0;

    /**
     * @brief 读取像素数据
     * @param x 起始X坐标
     * @param y 起始Y坐标
     * @param width 宽度
     * @param height 高度
     * @param outData 输出数据缓冲区
     * @return 成功返回 true
     */
    virtual bool readPixels(int x, int y, int width, int height, 
                            std::vector<uint8_t>& outData) = 0;
};

} // namespace extra2d
