#pragma once
/**
 * @file windows_render_context.h
 * @brief 定义Windows平台特定的渲染上下文
 *
 * 本文件定义了Windows平台下的渲染上下文实现，使用Direct3D 11和DXGI
 * 作为底层图形API，并集成到sokol图形库中。
 */

#include <d3d11.h>
#include <dxgi1_6.h>

#include "sokol_gfx.h"
#include "render/render_context.h"
#include "render/render_elements.h"

/**
 * @class windows_mirage_render_context
 * @brief Windows平台的渲染上下文实现
 *
 * 使用Direct3D 11和DXGI提供Windows平台特定的渲染能力。
 * 负责创建和管理D3D设备、上下文和交换链，并处理与sokol图形库的集成。
 */
class windows_mirage_render_context : public mirage_render_context {
public:
	/**
	 * @brief 默认构造函数
	 */
	windows_mirage_render_context() = default;

	//-------------- 生命周期管理 --------------

	/**
	 * @brief 初始化渲染上下文
	 * @return 初始化是否成功
	 *
	 * 创建Direct3D 11设备、设备上下文和DXGI工厂，
	 * 并检查可变刷新率支持等高级功能。
	 */
	bool init() override;

	/**
	 * @brief 清理渲染上下文
	 *
	 * 释放所有Direct3D和DXGI资源。
	 */
	void cleanup() override;

	//-------------- 环境和表面设置 --------------

	/**
	 * @brief 获取渲染环境
	 * @return sokol图形环境配置
	 *
	 * 返回包含Direct3D设备和上下文的sokol环境配置，
	 * 用于sokol图形库的初始化。
	 */
	sg_environment get_environment() override;

	/**
	 * @brief 获取设备
	 *
	 */
	[[nodiscard]] auto get_device() const { return device; }

	/**
	 * @brief 获取设备上下文
	 *
	 */
	[[nodiscard]] auto get_device_context() const { return device_context; }

	/**
	 * @brief 获取DXGI工厂
	 *
	 */
	[[nodiscard]] auto get_dxgi_factory() const { return dxgi_factory; }

	/**
	 * @brief 获取Direct3D功能级别
	 *
	 */
	[[nodiscard]] auto get_feature_level() const { return feature_level; }

	/**
	 * @brief 是否支持可变刷新率/撕裂
	 *
	 */
	[[nodiscard]] auto is_tearing_supported() const { return tearing_supported; }

	virtual std::unique_ptr<mirage_window_state> create_window_state(const Eigen::Vector2i& in_window_frame_size, void* in_window_handle) override;
private:
	/** Direct3D 11设备 */
	ID3D11Device* device{};

	/** Direct3D 11设备上下文 */
	ID3D11DeviceContext* device_context{};

	/** DXGI工厂，用于创建交换链 */
	IDXGIFactory* dxgi_factory{};

	/** Direct3D功能级别 */
	D3D_FEATURE_LEVEL feature_level;

	/** 是否支持可变刷新率/撕裂 */
	bool tearing_supported = false;
};
