#pragma once
/**
 * @file windows_render_state.h
 * @brief 定义Windows平台特定的窗口渲染状态
 *
 * 本文件定义了Windows平台下窗口渲染状态的具体实现，
 * 使用Direct3D 11和DXGI处理窗口的渲染表面、交换链和呈现操作。
 */

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

#include "render/render_context.h"

/**
 * @struct windows_render_state
 * @brief Windows平台的窗口渲染状态实现
 *
 * 继承自基础窗口状态，提供Direct3D 11特定的功能，
 * 包括呈现、清理和交换链管理等。
 */
struct windows_render_state final : mirage_window_state {
    //-------------- 访问器 --------------

    /**
     * @brief 获取Direct3D 11渲染目标视图
     * @return Direct3D 11渲染目标视图指针
     *
     * 提供对底层Direct3D渲染目标的访问，用于绘制操作。
     */
    ID3D11RenderTargetView* get_dx_render_target_view() const {
        return (ID3D11RenderTargetView*)swapchain.d3d11.render_view;
    }

    //-------------- 初始化和设置 --------------

    /**
     * @brief 初始化窗口渲染状态
     * @param in_device Direct3D 11设备
     * @param in_factory DXGI工厂
	 * @param in_window_frame_size 窗口框架大小
	 * @param in_window_handle Windows HWND句柄
     * @return 初始化是否成功
     *
     * 使用提供的Direct3D设备和DXGI工厂初始化窗口渲染状态，
     * 创建交换链和渲染目标视图。
     */
    bool init(ID3D11Device* in_device, IDXGIFactory* in_factory, const Eigen::Vector2i& in_window_frame_size, void* in_window_handle);

    /**
     * @brief 设置可变刷新率支持
     * @param support 是否支持可变刷新率
     *
     * 配置窗口是否使用可变刷新率（如FreeSync、G-Sync），
     * 影响交换链的呈现行为。
     */
    void set_tearing_support(bool support) { tearing_supported = support; }

    //-------------- 覆盖基类方法 --------------

    /**
     * @brief 清理资源
     *
     * 释放Direct3D和DXGI资源，包括渲染目标视图和交换链。
     * 覆盖基类方法。
     */
    virtual void on_clear() override;

    /**
     * @brief 呈现渲染内容
     *
     * 将渲染内容呈现到窗口，处理垂直同步和刷新率相关设置。
     * 覆盖基类方法。
     */
    virtual void present() override;

    /**
     * @brief 重建交换链
     * @param size 新的窗口大小
     *
     * 当窗口大小改变时，重新创建适合新尺寸的交换链和渲染目标。
     * 覆盖基类方法。
     */
    virtual void rebuild_swapchain(const Eigen::Vector2i& size) override;

private:
    /** Direct3D 11设备指针 */
    ID3D11Device* dx_device{};

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

    /** DXGI交换链 */
    IDXGISwapChain* dx_swap_chain{};

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