/**
 * DPI 感知引导模块
 * 在 Windows 平台上通过 koffi 调用 Win32 API 设置 DPI 感知级别，
 * 确保桌面操作（截图、坐标计算等）在高 DPI 显示器上获得正确的物理像素坐标。
 */

import * as koffi from 'koffi';

/**
 * DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
 * Windows SDK 定义的特殊句柄值（伪句柄），koffi 以 void* 传递整数时直接传入。
 * 参考: https://learn.microsoft.com/windows/win32/hidpi/dpi-awareness-context
 */
const DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = -4;

/**
 * 确保进程以 PER_MONITOR_AWARE_V2 DPI 感知模式运行。
 *
 * - Windows: 调用 user32.dll 的 SetProcessDpiAwarenessContext(-4)
 *   (-4 对应 DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)
 * - 非 Windows: 无操作，直接返回
 * - 任何错误均被捕获并通过 console.warn 警告，不抛出异常
 */
export function ensureDpiAware(): void {
  // 非 Windows 平台无需设置，直接跳过
  if (process.platform !== 'win32') {
    return;
  }

  try {
    // 加载 Windows 用户界面库
    const lib = koffi.load('user32.dll');

    /**
     * BOOL SetProcessDpiAwarenessContext(HANDLE value)
     * HANDLE 在 koffi 中用 'void *' 表示；
     * 特殊 handle 值 -4 = DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
     */
    const SetProcessDpiAwarenessContext = lib.func(
      'SetProcessDpiAwarenessContext',
      'bool',
      ['void *'],
    );

    // 将整数常量转换为指针值传入（koffi 接受数字作为 void* 参数）
    SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
  } catch (err) {
    // 捕获所有错误（如 DLL 未找到、API 不存在等），仅警告不中断启动
    console.warn('[desktop_op] DPI aware setup failed', err);
  }
}
