#pragma once
#include "Platform/Window.h"


namespace XEngine::graphics {

DEFINE_TYPED_ID(surface_id);

/**
 * @brief 表面类
 * @details 定义了渲染表面的属性与操作
 */
class surface
{
public:
	/**
	 * @brief 由表面 ID 构造句柄。
	 * @param id 表面 ID。
	 */
	constexpr explicit surface(surface_id id) : _id{ id } {}
	/**
	 * @brief 构造无效表面句柄。
	 */
	constexpr surface() = default;
	/**
	 * @brief 获取表面 ID。
	 * @return 表面 ID。
	 */
	constexpr surface_id get_id() const { return _id; }
	/**
	 * @brief 判断表面句柄是否有效。
	 * @return 有效返回 true。
	 */
	constexpr bool is_valid() const { return id::is_valid(_id); }


	/**
	 * @brief 调整表面大小。
	 * @param width 目标宽度。
	 * @param height 目标高度。
	 */
	void resize(u32 width, u32 height) const;
	/**
	 * @brief 获取表面宽度。
	 * @return 宽度像素值。
	 */
	u32 width() const;
	/**
	 * @brief 获取表面高度。
	 * @return 高度像素值。
	 */
	u32 height() const;

    void render() const;

private:
	surface_id _id{ id::invalid_id };
};

/**
 * @brief 渲染表面结构体
 * @details 定义了渲染表面的窗口与表面对象
 */
struct render_surface
{
    platform::window window{};
    surface surface{};
};

/**
 * @brief 图形渲染平台枚举
 * @details 定义了支持的图形渲染平台类型
 */
enum class graphics_platform : u32
{
    direct3d12 = 0,
    vulkan = 1,
    opengl = 2,
};

/**
 * @brief 初始化图形渲染平台
 * @details 调用设置平台接口函数，初始化指定的图形渲染平台
 * @param platform 图形渲染平台类型
 * @return true 如果初始化成功，否则返回 false
 */
bool initialize(graphics_platform platform);    
/**
 * @brief 关闭图形渲染平台
 * @details 调用关闭函数指针，关闭指定的图形渲染平台
 */
void shutdown();

/**
 * @brief 创建渲染表面
 * @details window 渲染表面的窗口
 * @return 渲染表面对象柄
 */
surface create_surface(platform::window window);

/**
 * @brief 移除渲染表面
 * @details id 渲染表面的 ID
 */
void remove_surface(surface_id id);

}