/**
 * @file EngineWin32.cpp
 * @brief Win32 运行模式下的引擎生命周期实现。
 * @details
 * 该文件负责连接平台消息循环与引擎帧循环：
 * - 初始化阶段加载内容并创建主窗口；
 * - 更新阶段驱动脚本系统与帧间休眠；
 * - 关闭阶段销毁窗口并卸载内容资源。
 */

#if !defined(SHIPPING) && defined(_WIN64)
#include "..\Content\ContentLoader.h"
#include "..\Components\Script.h"
#include "..\Platform\PlatformTypes.h"
#include "..\Platform\Platform.h"
#include "..\Graphics\Renderer.h"
#include <thread>

using namespace XEngine;

namespace {

/**
 * @brief 游戏窗口渲染表面实例。
 */
graphics::render_surface game_window{};

/**
 * @brief 主窗口消息回调。
 * @param hwnd 窗口句柄。
 * @param msg 消息类型。
 * @param wparam 消息参数。
 * @param lparam 消息参数。
 * @return 消息处理结果。
 */
LRESULT win_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	switch (msg)
	{
	case WM_DESTROY:
	{
		if (game_window.window.is_closed())
		{
			PostQuitMessage(0);
			return 0;
		}
	}
	case WM_SYSCHAR:
		if (wparam == VK_RETURN && (HIWORD(lparam) & KF_ALTDOWN))
		{
			game_window.window.set_fullscreen(!game_window.window.is_fullscreen());
			return 0;
		}
	default:
		break;
	}

	return DefWindowProc(hwnd, msg, wparam, lparam);
}

}

/**
 * @brief 初始化引擎运行环境。
 * @return 初始化成功返回 true。
 */
bool 
engine_initialize()
{
	if (!XEngine::content::load_games()) return false;
	platform::window_init_info info
	{
		&win_proc, nullptr, L"XGame"
	};

	game_window.window = platform::create_window(&info);
	if (!game_window.window.is_valid()) return false;

	return true;
}
/**
 * @brief 执行单帧更新。
 */
void 
engine_update()
{
	XEngine::script::update(10.f);
	std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
/**
 * @brief 关闭引擎并释放运行时资源。
 */
void
engine_shutdown()
{
	platform::remove_window(game_window.window.get_id());
	XEngine::content::unload_game();
}




#endif //!defined(SHIPPING)
