/**
 * DPI 感知引导测试
 * 使用 jest.doMock 逐测试模拟 koffi，避免真实加载原生 DLL
 */

// 保存原始 platform 描述符，供每个测试用例恢复
const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, 'platform')!;

afterEach(() => {
  // 每个测试结束后恢复 platform
  Object.defineProperty(process, 'platform', originalPlatformDescriptor);
  // 清空所有 mock 调用记录
  jest.clearAllMocks();
});

describe('ensureDpiAware', () => {
  it('在非 win32 平台上不调用 koffi', async () => {
    // 将 platform 设置为 linux，模拟非 Windows 环境
    Object.defineProperty(process, 'platform', { value: 'linux', configurable: true });

    jest.resetModules();
    const mockLoad = jest.fn();
    jest.doMock('koffi', () => ({ load: mockLoad }));

    const { ensureDpiAware } = await import('../../../../src/modules/desktop_op/runtime/dpi.js');

    ensureDpiAware();

    // 非 win32 平台不应调用 koffi.load
    expect(mockLoad).not.toHaveBeenCalled();
  });

  it('在 win32 平台上通过 user32 调用 SetProcessDpiAwarenessContext', async () => {
    // 将 platform 设置为 win32，模拟 Windows 环境
    Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });

    // 构造假的 SetProcessDpiAwarenessContext 函数
    const mockSetDpi = jest.fn().mockReturnValue(1);
    const mockLib = {
      func: jest.fn().mockReturnValue(mockSetDpi),
    };

    jest.resetModules();
    jest.doMock('koffi', () => ({
      load: jest.fn().mockReturnValue(mockLib),
    }));

    const { ensureDpiAware } = await import('../../../../src/modules/desktop_op/runtime/dpi.js');

    ensureDpiAware();

    // 应当加载 user32.dll
    const koffiMod = require('koffi');
    expect(koffiMod.load).toHaveBeenCalledWith('user32.dll');

    // 应当通过 lib.func 获取函数，返回类型和参数列表要精确匹配实现
    expect(mockLib.func).toHaveBeenCalledWith(
      'SetProcessDpiAwarenessContext',
      'bool',
      ['void *'],
    );

    // SetProcessDpiAwarenessContext 应当被调用（传入 -4 对应 DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2）
    expect(mockSetDpi).toHaveBeenCalled();
  });

  it('发生错误时吞掉异常并通过 console.warn 警告，不抛出', async () => {
    // 将 platform 设置为 win32，让代码尝试加载 DLL
    Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });

    jest.resetModules();
    jest.doMock('koffi', () => ({
      // 模拟 koffi.load 抛出异常
      load: jest.fn().mockImplementation(() => {
        throw new Error('模拟 DLL 加载失败');
      }),
    }));

    const { ensureDpiAware } = await import('../../../../src/modules/desktop_op/runtime/dpi.js');

    // 监听 console.warn
    const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});

    // 不应抛出异常
    expect(() => ensureDpiAware()).not.toThrow();

    // 应当调用 console.warn 并包含错误信息
    expect(warnSpy).toHaveBeenCalledWith(
      '[desktop_op] DPI aware setup failed',
      expect.any(Error),
    );

    warnSpy.mockRestore();
  });
});
