// Electron 메인 프로세스 — 배포용 데스크톱 앱(맥/윈도우).
// 로컬 클라이언트 런타임(server/index.js)을 앱 내부에서 구동하고 CMS 창을 연다.
// ※ 보호(서버 전용) 코드는 cloud/ 에 있으며 이 패키지에 포함되지 않는다.
const { app, BrowserWindow, shell, dialog } = require('electron');
const path = require('path');
const { pathToFileURL } = require('url');

// ── 업데이트 (이중 도메인 폴백: 한쪽 장애 시 다른 쪽) ──
// 다운로드/피드 주소·포털 주소를 cdmb → hcjoyn 순으로 시도.
const FEEDS = ['https://cms.cdmb.net/download/', 'https://cms.hcjoyn.com/download/'];
const PORTALS = ['https://cms.cdmb.net/', 'https://cms.hcjoyn.com/'];
function cmpVer(a, b) { const pa = String(a).split('.').map(Number), pb = String(b).split('.').map(Number); for (let i = 0; i < 3; i++) { const x = pa[i] || 0, y = pb[i] || 0; if (x > y) return 1; if (x < y) return -1; } return 0; }
// Windows/폴백: version.json 알림. 두 도메인을 순차 시도(하나 실패하면 다음).
async function checkUpdate() {
  for (let i = 0; i < FEEDS.length; i++) {
    try {
      const r = await fetch(FEEDS[i] + 'version.json', { cache: 'no-store' });
      if (!r.ok) continue;
      const j = await r.json();
      const latest = j.latest || j.version;
      if (!latest || cmpVer(latest, app.getVersion()) <= 0) return; // 최신 → 조용히 종료
      const rel = (j.releases || []).find((x) => x.version === latest) || {};
      const notes = Array.isArray(rel.notes) ? ('• ' + rel.notes.join('\n• ')) : (rel.notes || '');
      const res = await dialog.showMessageBox({
        type: 'info', title: 'CDMB CMS 업데이트',
        message: `새 버전 ${latest} 이(가) 있습니다.  (현재 ${app.getVersion()})`,
        detail: notes ? `변경 사항:\n${notes}` : '',
        buttons: ['다운로드 페이지 열기', '나중에'], defaultId: 0, cancelId: 1,
      });
      if (res.response === 0) shell.openExternal(PORTALS[i]);
      return;
    } catch { /* 이 도메인 실패 → 다음 도메인 시도 */ }
  }
}

process.env.NO_OPEN = '1';                 // 시스템 브라우저 자동열기 끔(Electron 창에서 표시)
process.env.PORT = process.env.PORT || '47600';
const CMS_URL = `http://localhost:${process.env.PORT}/cms/`;

let started = false;
async function startLocalRuntime() {
  if (started) return; started = true;
  // ESM 서버를 동적 import 로 구동 (listen 시작). Windows 절대경로 대응 위해 file:// URL 사용
  await import(pathToFileURL(path.join(__dirname, '..', 'server', 'index.js')).href);
}

function createWindow() {
  const win = new BrowserWindow({
    width: 1440, height: 900,
    title: 'CDMB CMS',
    backgroundColor: '#0d1117',
    webPreferences: { contextIsolation: true },
  });
  // 외부 링크는 기본 브라우저로
  win.webContents.setWindowOpenHandler(({ url }) => {
    if (!url.startsWith('http://localhost')) { shell.openExternal(url); return { action: 'deny' }; }
    return { action: 'allow' };
  });
  const tryLoad = (n) => win.loadURL(CMS_URL).catch(() => { if (n > 0) setTimeout(() => tryLoad(n - 1), 500); });
  tryLoad(20);
}

// macOS: electron-updater로 실제 자동 업데이트(서명·공증 필요) / Windows: 수동 알림(위 checkUpdate)
function setupUpdates() {
  if (process.platform === 'darwin') {
    try {
      const { autoUpdater } = require('electron-updater');
      autoUpdater.autoDownload = true;
      autoUpdater.autoInstallOnAppQuit = true;
      let fi = 0; // 현재 피드 인덱스 (0=cdmb, 1=hcjoyn)
      const setFeed = (i) => { try { autoUpdater.setFeedURL({ provider: 'generic', url: FEEDS[i] }); } catch {} };
      setFeed(0);
      autoUpdater.on('update-downloaded', async (info) => {
        const r = await dialog.showMessageBox({
          type: 'info', title: 'CDMB CMS 업데이트',
          message: `새 버전 ${info.version} 이(가) 다운로드되었습니다.`,
          detail: '지금 재시작하면 적용됩니다.',
          buttons: ['지금 재시작', '나중에'], defaultId: 0, cancelId: 1,
        });
        if (r.response === 0) autoUpdater.quitAndInstall();
      });
      // 한 도메인 실패 시 다음 도메인으로 폴백(1회)
      autoUpdater.on('error', () => { if (fi + 1 < FEEDS.length) { fi += 1; setFeed(fi); autoUpdater.checkForUpdates().catch(() => {}); } });
      setTimeout(() => autoUpdater.checkForUpdates().catch(() => {}), 6000);
      setInterval(() => { fi = 0; setFeed(0); autoUpdater.checkForUpdates().catch(() => {}); }, 6 * 60 * 60 * 1000);
    } catch (e) { console.error('updater 로드 실패:', e.message); setTimeout(checkUpdate, 6000); }
  } else {
    setTimeout(checkUpdate, 6000);                     // 시작 후 1회
    setInterval(checkUpdate, 6 * 60 * 60 * 1000);      // 6시간마다
  }
}

app.whenReady().then(async () => {
  try { await startLocalRuntime(); } catch (e) { console.error('로컬 런타임 시작 실패:', e); }
  setTimeout(createWindow, 700);
  setupUpdates();
  app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow(); });
});
app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit(); });
