import { app, shell, BrowserWindow, protocol, net, ipcMain } from 'electron';
import { join, resolve } from 'path';
import url from 'url';
import { electronApp, optimizer, is } from '@electron-toolkit/utils';
import icon from '../../resources/icon.png?asset';
import useElectron from './useElectron';
import useWinProcess from './useWinProcess';
import log from './logger';

const ULR_SCHEME_PROTOCOL = 'trd://';
let mainWindow: BrowserWindow | null = null;

function main() {
  const gotTheLock = app.requestSingleInstanceLock();
  log.info(`gotTheLock:${gotTheLock}`);
  if (!gotTheLock) {
    app.quit();
    return;
  }

  function createWindow(): void {
    // Create the browser window.
    mainWindow = new BrowserWindow({
      width: is.dev ? 1428 : 1024,
      height: 700,
      minWidth: 1024,
      minHeight: 600,
      show: false,
      ...(process.platform === 'linux' ? { icon } : {}),
      webPreferences: {
        preload: join(__dirname, '../preload/index.js'),
        sandbox: false,
        webSecurity: false,
      },
    });
    if (!mainWindow) return;

    mainWindow.on('ready-to-show', () => {
      mainWindow?.show();
    });

    mainWindow.webContents.setWindowOpenHandler((details) => {
      shell.openExternal(details.url);
      return { action: 'deny' };
    });

    // HMR for renderer base on electron-vite cli.
    // Load the remote URL for development or the local html file for production.
    if (is.dev && process.env.ELECTRON_RENDERER_URL) {
      mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL);
      mainWindow.webContents.openDevTools();
    } else {
      mainWindow.loadFile(join(__dirname, '../renderer/index.html'));
    }
  }

  // This method will be called when Electron has finished
  // initialization and is ready to create browser windows.
  // Some APIs can only be used after this event occurs.
  app.whenReady().then(() => {
    // Set app user model id for windows
    electronApp.setAppUserModelId('com.electron');

    // Default open or close DevTools by F12 in development
    // and ignore CommandOrControl + R in production.
    // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
    app.on('browser-window-created', (_, window) => {
      optimizer.watchWindowShortcuts(window);
    });

    // use electron
    useElectron();
    // use multiple window porcess
    useWinProcess();
    // 渲染进程加载好之后，会发起check-silence-authority
    ipcMain.handleOnce('check-silence-authority', () => {
      const argv = process.argv;
      log.info(`check-silence-authority process.argv:${JSON.stringify(argv)}`);
      const urlScheme = argv.find((arg) => arg.startsWith(ULR_SCHEME_PROTOCOL));
      return urlScheme || '';
    });

    createWindow();

    // protocol
    protocol.handle('local', (request) => {
      const filePath = request.url.slice('local://'.length);
      return net.fetch(
        url.pathToFileURL(resolve(__dirname, filePath)).toString()
      );
    });

    app.on('activate', () => {
      // On macOS it's common to re-create a window in the app when the
      // dock icon is clicked and there are no other windows open.
      if (BrowserWindow.getAllWindows().length === 0) createWindow();
    });
  });

  // Quit when all windows are closed, except on macOS. There, it's common
  // for applications and their menu bar to stay active until the user quits
  // explicitly with Cmd + Q.
  app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
      app.quit();
    }
  });

  // In this file you can include the rest of your app"s specific main process
  // code. You can also put them in separate files and require them here.

  // simple instance
  app.on('second-instance', (event, argv) => {
    silenceAuthorityHandle(argv);
    mainWindow?.show();
  });

  // 免登录流程
  function silenceAuthorityHandle(argv: string[]) {
    log.info(`second-instance process.argv:${JSON.stringify(argv)}`);
    const urlScheme = argv.find((arg) => arg.startsWith(ULR_SCHEME_PROTOCOL));
    if (urlScheme && mainWindow) {
      mainWindow.webContents.send('silence-authority', urlScheme);
    }
  }
}

main();
