import {app, BrowserWindow, shell, globalShortcut} from "electron";
import * as minimist from "minimist";
import * as path from "path";
import * as url from "url";
import {setupMenu} from "./menu";
import checkVersion from "./util/checkVersion";
import {setMetadata, setAppName} from "./util/metadata";
import {APP_NAME} from "./constants";

let mainWindow: Electron.BrowserWindow;
const argv = minimist(process.argv.slice(1));
const EXCALIDRAW_BUNDLE = path.join(__dirname, "client", "index.html");
const APP_ICON_PATH = path.join(__dirname, "client", "logo-180x180.png");

function createWindow() {
  mainWindow = new BrowserWindow({
    show: false,
    height: 600,
    width: 800,
    webPreferences: {
      contextIsolation: true, // protect against prototype pollution
      preload: `${__dirname}/preload.js`,
    },
  });

  if (argv.devtools) {
    mainWindow.webContents.openDevTools({mode: "detach"});
  }

  mainWindow.webContents.on("will-navigate", openExternalURLs);
  mainWindow.webContents.on("new-window", openExternalURLs);

  mainWindow.loadURL(
    url.format({
      pathname: EXCALIDRAW_BUNDLE,
      protocol: "file",
      slashes: true,
    }),
  );

  mainWindow.on("closed", () => {
    mainWindow = null;
  });

  // Enable Cmd+Q on mac to quit the application
  if (process.platform === "darwin") {
    globalShortcut.register("Command+Q", () => {
      app.quit();
    });
  }

  // calling.show after this event, ensure there's no visual flash
  mainWindow.once("ready-to-show", async () => {
    const versions = await checkVersion();

    console.info("Current version", versions.local);
    console.info("Needs update", versions.needsUpdate);

    setAppName(APP_NAME);
    setMetadata("versions", versions);
    setMetadata("appIconPath", APP_ICON_PATH);
    setupMenu(mainWindow);

    mainWindow.show();
  });
}

// Open external links in user's default browser instead of webview
function openExternalURLs(event: Electron.Event, url: string) {
  if (url.startsWith("http")) {
    event.preventDefault();
    shell.openExternal(url);
  }
}

app.on("ready", createWindow);

app.on("window-all-closed", () => {
  if (process.platform !== "darwin") {
    app.quit();
  }
});

app.on("activate", () => {
  if (mainWindow === null) {
    createWindow();
  }
});