import { app, Menu } from 'electron';
import log from 'electron-log/main';

import { APP_ID } from './config';
import { registerIpcHandlers } from './ipc';
import { registerAppProtocol, registerSchemePrivileges } from './protocol';
import { registerGlobalShortcut, unregisterGlobalShortcut } from './shortcut';
import { createTray } from './tray';
import { initUpdater } from './updater';
import { createMainWindow, getMainWindow, markQuitting, showMainWindow } from './window';

/**
 * 主进程入口：负责应用生命周期编排
 * 启动顺序：单实例锁 → 特权协议注册（必须在 ready 前）→ ready 后依次初始化
 * 协议服务 / IPC / 主窗口 / 托盘 / 全局快捷键 / 自动更新
 */

// 显式设置应用名：userData / 日志目录会随之落到 %APPDATA%\萧康云医，
// 不设置的话 Electron 会取 package.json 的 name（@vben/desktop），生成嵌套目录不利于运维排查
app.setName('萧康云医');

// Windows 通知归属与任务栏分组标识，必须与 electron-builder 的 appId 一致，
// 否则系统通知不显示或显示为「electron.app.Electron」
app.setAppUserModelId(APP_ID);

// 单实例锁：避免多开导致托盘、自动更新、本地设置互相干扰
if (app.requestSingleInstanceLock()) {
  // 特权协议必须在 app ready 之前注册，否则 app:// 无法成为安全上下文
  registerSchemePrivileges();

  // 重复启动（用户再次双击图标）时唤起已有窗口
  app.on('second-instance', () => showMainWindow());

  app.whenReady().then(() => {
    // electron-log 初始化：主进程日志落 userData/logs，便于排查线上问题
    log.initialize();

    // mac 必须保留应用菜单，否则 Cmd+C/V/Q 等系统快捷键失效；Windows 隐藏菜单栏
    if (process.platform === 'darwin') {
      Menu.setApplicationMenu(
        Menu.buildFromTemplate([
          { role: 'appMenu' },
          { role: 'editMenu' },
          { role: 'viewMenu' },
          { role: 'windowMenu' },
        ]),
      );
    } else {
      Menu.setApplicationMenu(null);
    }

    registerAppProtocol();
    registerIpcHandlers();

    // 开机自启带 --hidden 参数：静默启动进托盘，不弹主窗口打扰用户
    const startHidden = process.argv.includes('--hidden');
    createMainWindow({ startHidden });

    createTray();
    registerGlobalShortcut();
    initUpdater();
  });

  // mac 点击 Dock 图标恢复窗口（关窗只是隐藏，符合平台惯例）
  app.on('activate', () => {
    if (getMainWindow()) showMainWindow();
  });

  // 常驻托盘模式：窗口全部关闭也不退出（close 已被拦截为隐藏，这里是兜底），退出走托盘菜单/Cmd+Q
  app.on('window-all-closed', () => {
    // 故意留空：不调用 app.quit()
  });

  // 任何退出路径（托盘退出 / Cmd+Q / 自动更新安装）都先放行窗口 close 拦截
  app.on('before-quit', () => markQuitting());

  // 退出前注销全局快捷键，避免残留占用
  app.on('will-quit', () => unregisterGlobalShortcut());
} else {
  app.quit();
}
