// Electron 메인 — 자체 창 데스크톱 앱. 매번 자기 전용(빈) 포트로 자기 서버를 직접 띄운다(좀비 프로세스에 안 붙음).
const { app, BrowserWindow, shell } = require("electron");

process.env.NO_OPEN = "1"; // 앱 창을 쓰므로 외부 브라우저 자동열기 끔

// 단일 인스턴스 — 두 번 켜면 기존 창을 앞으로(좀비/중복 방지)
if (!app.requestSingleInstanceLock()) { app.quit(); }
else {
  let win;
  app.on("second-instance", () => { if (win) { if (win.isMinimized()) win.restore(); win.focus(); } });

  async function boot() {
    const path = require("path"), fs = require("fs"), { pathToFileURL } = require("url");
    const bundledDir = __dirname;
    let runtimeDir = bundledDir;
    try { // R2에서 최신 런타임 받아오기(실패/오프라인이면 번들). 앱 실행을 막지 않게 try로 감쌈.
      const { resolveRuntimeDir } = require("./runtime_sync.cjs");
      const remote = await resolveRuntimeDir(bundledDir, app.getPath("userData"));
      if (remote) runtimeDir = remote;
    } catch (e) { console.error("runtime sync failed:", e); }

    let port = 0;
    const candidates = runtimeDir === bundledDir ? [bundledDir] : [runtimeDir, bundledDir]; // 원격 우선, 안 되면 번들로 폴백
    for (const dir of candidates) {
      try {
        if (!fs.existsSync(path.join(dir, "server.mjs"))) continue;
        const { startServer } = await import(pathToFileURL(path.join(dir, "server.mjs")).href); // 내부 데이터/LCU 서버
        const r = await startServer(0); // 포트 0 = OS가 빈 포트 배정 → 항상 새 서버
        port = r.port;
        console.log("server started from", dir === bundledDir ? "bundle" : "remote runtime", "port", port);
        break;
      } catch (e) { console.error("server start failed from", dir, e); }
    }

    win = new BrowserWindow({
      width: 1240, height: 860, minWidth: 960, minHeight: 600,
      title: "ARAM Mayhem", autoHideMenuBar: true, backgroundColor: "#0a0e17",
      webPreferences: { contextIsolation: true }
    });
    win.loadURL(`http://127.0.0.1:${port}`);
    win.webContents.setWindowOpenHandler(({ url }) => { shell.openExternal(url); return { action: "deny" }; });
  }

  app.whenReady().then(boot);
  app.on("window-all-closed", () => app.quit());
  app.on("activate", () => { if (BrowserWindow.getAllWindows().length === 0) boot(); });
}
