/**
 * @file MainWin32.cpp
 * @brief Win32 可执行程序入口与消息泵实现。
 * @details
 * 负责设置工作目录、初始化调试内存检测，并驱动主循环：
 * - 轮询并分发 Windows 消息；
 * - 在消息空闲阶段调用 engine_update；
 * - 退出时由 engine_shutdown 完成资源收尾。
 */
#ifdef _WIN64
#include "CommonHeader.h"
#include <filesystem>
#ifndef WIN32_MEAN_AND_LEAN
#define WIN32_MEAN_AND_LEAN
#endif

#include <Windows.h>
#include <crtdbg.h>

namespace {

/**
 * @brief 将当前工作目录切换到可执行文件所在目录。
 * @return 切换后的当前目录；失败时返回空路径。
 */
std::filesystem::path
set_current_directory_to_executable_path()
{
	wchar_t path[MAX_PATH]{};
	const uint32_t length{ GetModuleFileName(0, &path[0], MAX_PATH) };
	if (!length || GetLastError() == ERROR_INSUFFICIENT_BUFFER) return {};
	std::filesystem::path p{ path };
	std::filesystem::current_path(p.parent_path());
	return std::filesystem::current_path();
}

}

#ifndef USE_WITH_EDITOR

extern bool engine_initialize();
extern void engine_update();
extern void engine_shutdown();

/**
 * @brief Win32 程序入口函数。
 * @return 进程退出码。
 */
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	
#if _DEBUG
		_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif

		set_current_directory_to_executable_path();

		if (engine_initialize())
		{
			MSG msg{};
			bool is_running{ true };
			while (is_running)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					TranslateMessage(&msg);
					DispatchMessage(&msg);
					is_running &= (msg.message != WM_QUIT);
				}

				engine_update();
			}
		}
}

#endif // USE_WITH_EDITOR
#endif // _WIN64
