import electron from 'electron';
import { execFile } from 'node:child_process';
const { app } = electron;

/**
 * v0.2.7 F12 deeper fix — 자동 실행 진단 정보 수집.
 *
 * Electron 의 `app.getLoginItemSettings()` 는 args 가 매칭돼야만 정확한 상태를 반환 →
 * `args: ['--hidden']` 으로 등록 vs `args: undefined` 로 조회하면 mismatch 가 발생할 수 있다.
 * 그래서 두 호출 결과를 모두 노출 (withArgs / noArgs) + Win 에서는 registry 직접 조회까지.
 */
export interface AutostartState {
  withArgs: { openAtLogin: boolean; executableWillLaunchAtLogin: boolean };
  noArgs: { openAtLogin: boolean; executableWillLaunchAtLogin: boolean };
  execPath: string;
  registryPath?: string;
  registryValue?: string | null;
}

const WIN_REGISTRY_PATH = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run';
const WIN_REGISTRY_KEY = 'Inkling';

export async function collectAutostartState(): Promise<AutostartState> {
  const w = app.getLoginItemSettings({ args: ['--hidden'] });
  const n = app.getLoginItemSettings();
  const state: AutostartState = {
    withArgs: { openAtLogin: w.openAtLogin, executableWillLaunchAtLogin: w.executableWillLaunchAtLogin },
    noArgs: { openAtLogin: n.openAtLogin, executableWillLaunchAtLogin: n.executableWillLaunchAtLogin },
    execPath: process.execPath
  };
  if (process.platform === 'win32') {
    state.registryPath = `${WIN_REGISTRY_PATH}\\${WIN_REGISTRY_KEY}`;
    state.registryValue = await readRegistrySilent();
  }
  return state;
}

/**
 * `reg query` 로 HKCU\\...\\Run\\Inkling 의 값을 조회.
 * 키가 없으면 reg.exe 가 exit 1 → silent fallback (null).
 *
 * promisify(execFile) 대신 직접 Promise 로 wrapping — 테스트에서 vi.mock 이
 * `util.promisify.custom` symbol 을 보전하지 못해 stdout 이 undefined 가 되는 이슈 회피.
 */
function readRegistrySilent(): Promise<string | null> {
  return new Promise((resolve) => {
    execFile('reg', ['query', WIN_REGISTRY_PATH, '/v', WIN_REGISTRY_KEY], (err, stdout) => {
      if (err) {
        resolve(null);
        return;
      }
      const m = stdout.match(/REG_SZ\s+(.+)/);
      resolve(m && m[1] ? m[1].trim() : null);
    });
  });
}
