/*
 * notion-enhancer
 * (c) 2020 dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)
 * under the MIT license
 */

'use strict';

module.exports = (store, __exports) => {
  const electron = require('electron'),
    fs = require('fs-extra'),
    { __notion } = require('../../pkg/helpers.js'),
    createWindow = require(`${__notion}/app/main/createWindow.js`),
    config = require(`${__notion}/app/config.js`),
    notion_intl = require(`${__notion}/app/shared/notion-intl/index.js`),
    localizationHelper = require(`${__notion}/app/helpers/localizationHelper.js`),
    isMac = process.platform === 'darwin',
    // why is it inversed? i have no idea, but for some reason this is what works
    tabsEnabled = !(store('mods')['e1692c29-475e-437b-b7ff-3eee872e1a42'] || {})
      .enabled,
    menuMessages = notion_intl.defineMessages({
      fileMenuTitle: {
        id: 'desktopTopbar.fileMenu.title',
        defaultMessage: 'File',
      },
      editMenuTitle: {
        id: 'desktopTopbar.editMenu.title',
        defaultMessage: 'Edit',
      },
      viewMenuTitle: {
        id: 'desktopTopbar.viewMenu.title',
        defaultMessage: 'View',
      },
      windowMenuTitle: {
        id: 'desktopTopbar.windowMenu.title',
        defaultMessage: 'Window',
      },
      helpTitle: {
        id: 'desktopTopbar.helpMenu.title',
        defaultMessage: 'Help',
      },
      newWindow: {
        id: 'desktopTopbar.fileMenu.newWindow',
        defaultMessage: 'New Window',
      },
      closeWindow: {
        id: 'desktopTopbar.fileMenu.close',
        defaultMessage: 'Close Window',
      },
      quit: {
        id: 'desktopTopbar.fileMenu.quit',
        defaultMessage: 'Exit',
      },
      undo: {
        id: 'desktopTopbar.editMenu.undo',
        defaultMessage: 'Undo',
      },
      redo: {
        id: 'desktopTopbar.editMenu.redo',
        defaultMessage: 'Redo',
      },
      cut: {
        id: 'desktopTopbar.editMenu.cut',
        defaultMessage: 'Cut',
      },
      copy: {
        id: 'desktopTopbar.editMenu.copy',
        defaultMessage: 'Copy',
      },
      paste: {
        id: 'desktopTopbar.editMenu.paste',
        defaultMessage: 'Paste',
      },
      selectAll: {
        id: 'desktopTopbar.editMenu.selectAll',
        defaultMessage: 'Select All',
      },
      startSpeaking: {
        id: 'desktopTopbar.editMenu.speech.startSpeaking',
        defaultMessage: 'Start Speaking',
      },
      stopSpeaking: {
        id: 'desktopTopbar.editMenu.speech.stopSpeaking',
        defaultMessage: 'Stop Speaking',
      },
      speech: {
        id: 'desktopTopbar.editMenu.speech',
        defaultMessage: 'Speech',
      },
      reload: {
        id: 'desktopTopbar.viewMenu.reload',
        defaultMessage: 'Reload',
      },
      togglefullscreen: {
        id: 'desktopTopbar.viewMenu.togglefullscreen',
        defaultMessage: 'Toggle Full Screen',
      },
      toggleDevTools: {
        id: 'desktopTopbar.toggleDevTools',
        defaultMessage: 'Toggle Developer Tools',
      },
      toggleWindowDevTools: {
        id: 'desktopTopbar.toggleWindowDevTools',
        defaultMessage: 'Toggle Window Developer Tools',
      },
      maximize: {
        id: 'desktopTopbar.windowMenu.maximize',
        defaultMessage: 'Maximize',
      },
      minimize: {
        id: 'desktopTopbar.windowMenu.minimize',
        defaultMessage: 'Minimize',
      },
      zoom: {
        id: 'desktopTopbar.windowMenu.zoom',
        defaultMessage: 'Zoom',
      },
      front: {
        id: 'desktopTopbar.windowMenu.front',
        defaultMessage: 'Front',
      },
      close: {
        id: 'desktopTopbar.windowMenu.close',
        defaultMessage: 'Close',
      },
      help: {
        id: 'desktopTopbar.helpMenu.openHelpAndSupport',
        defaultMessage: 'Open Help & Support',
      },
      reset: {
        id: 'desktopTopbar.appMenu.resetAppAndClearData',
        defaultMessage: 'Reset App & Clear Local Data',
      },
      about: {
        id: 'desktopTopbar.appMenu.about',
        defaultMessage: 'About Notion',
      },
      services: {
        id: 'desktopTopbar.appMenu.services',
        defaultMessage: 'Services',
      },
      hide: { id: 'desktopTopbar.appMenu.hide', defaultMessage: 'Hide Notion' },
      hideOthers: {
        id: 'desktopTopbar.appMenu.hideOthers',
        defaultMessage: 'Hide Others',
      },
      unhide: {
        id: 'desktopTopbar.appMenu.unhide',
        defaultMessage: 'Show All',
      },
      quitMac: { id: 'desktopTopbar.appMenu.quit', defaultMessage: 'Quit' },
    }),
    escapeAmpersand = (message) => message.replace(/&/g, '&&');
  __exports.setupSystemMenu = (locale) => {
    const intl = localizationHelper.createIntlShape(locale),
      fileMenu = {
        role: 'fileMenu',
        label: escapeAmpersand(intl.formatMessage(menuMessages.fileMenuTitle)),
        submenu: isMac
          ? [
              {
                label: escapeAmpersand(
                  intl.formatMessage(menuMessages.newWindow)
                ),
                accelerator: 'CmdOrCtrl+Shift+N',
                click: () => createWindow.createWindow(),
              },
              ...(tabsEnabled
                ? [
                    {
                      role: 'close',
                      label: escapeAmpersand(
                        intl.formatMessage(menuMessages.closeWindow)
                      ),
                    },
                  ]
                : []),
            ]
          : [
              {
                label: escapeAmpersand(
                  intl.formatMessage(menuMessages.newWindow)
                ),
                accelerator: 'CmdOrCtrl+Shift+N',
                click: () => createWindow.createWindow(),
              },
              ...(tabsEnabled
                ? [
                    {
                      role: 'quit',
                      label: escapeAmpersand(
                        intl.formatMessage(menuMessages.quit)
                      ),
                    },
                  ]
                : []),
            ],
      },
      editMenu = {
        role: 'editMenu',
        label: escapeAmpersand(intl.formatMessage(menuMessages.editMenuTitle)),
        submenu: isMac
          ? [
              {
                role: 'undo',
                label: escapeAmpersand(intl.formatMessage(menuMessages.undo)),
              },
              {
                role: 'redo',
                label: escapeAmpersand(intl.formatMessage(menuMessages.redo)),
              },
              { type: 'separator' },
              {
                role: 'cut',
                label: escapeAmpersand(intl.formatMessage(menuMessages.cut)),
              },
              {
                role: 'copy',
                label: escapeAmpersand(intl.formatMessage(menuMessages.copy)),
              },
              {
                role: 'paste',
                label: escapeAmpersand(intl.formatMessage(menuMessages.paste)),
              },
              {
                role: 'selectAll',
                label: escapeAmpersand(
                  intl.formatMessage(menuMessages.selectAll)
                ),
              },
              { type: 'separator' },
              {
                label: escapeAmpersand(intl.formatMessage(menuMessages.speech)),
                submenu: [
                  {
                    role: 'startSpeaking',
                    label: escapeAmpersand(
                      intl.formatMessage(menuMessages.startSpeaking)
                    ),
                  },
                  {
                    role: 'stopSpeaking',
                    label: escapeAmpersand(
                      intl.formatMessage(menuMessages.stopSpeaking)
                    ),
                  },
                ],
              },
            ]
          : [
              {
                role: 'undo',
                label: escapeAmpersand(intl.formatMessage(menuMessages.undo)),
              },
              {
                role: 'redo',
                label: escapeAmpersand(intl.formatMessage(menuMessages.redo)),
              },
              { type: 'separator' },
              {
                role: 'cut',
                label: escapeAmpersand(intl.formatMessage(menuMessages.cut)),
              },
              {
                role: 'copy',
                label: escapeAmpersand(intl.formatMessage(menuMessages.copy)),
              },
              {
                role: 'paste',
                label: escapeAmpersand(intl.formatMessage(menuMessages.paste)),
              },
              { type: 'separator' },
              {
                role: 'selectAll',
                label: escapeAmpersand(
                  intl.formatMessage(menuMessages.selectAll)
                ),
              },
            ],
      },
      viewMenu = {
        role: 'viewMenu',
        label: escapeAmpersand(intl.formatMessage(menuMessages.viewMenuTitle)),
        submenu: [
          {
            label: escapeAmpersand(intl.formatMessage(menuMessages.reload)),
            accelerator: 'CmdOrCtrl+R',
            click() {
              const focusedWebContents = electron.webContents.getFocusedWebContents();
              if (focusedWebContents) {
                if (focusedWebContents.hostWebContents) {
                  for (const webContentsInstance of electron.webContents.getAllWebContents()) {
                    if (
                      webContentsInstance.hostWebContents ===
                      focusedWebContents.hostWebContents
                    ) {
                      webContentsInstance.reload();
                    }
                  }
                } else {
                  focusedWebContents.reload();
                }
              }
            },
          },
          {
            label: escapeAmpersand(
              intl.formatMessage(menuMessages.toggleDevTools)
            ),
            accelerator: isMac ? 'Alt+Command+I' : 'Ctrl+Shift+I',
            click() {
              let focusedWebContents = electron.webContents.getFocusedWebContents();
              if (focusedWebContents) {
                const focusedWebContentsUrl = focusedWebContents.getURL();
                if (
                  focusedWebContentsUrl.startsWith('file://') &&
                  focusedWebContentsUrl.endsWith('/search.html')
                ) {
                  const notionWebviewWebContents = electron.webContents
                    .getAllWebContents()
                    .find(
                      (webContentsInstance) =>
                        webContentsInstance.hostWebContents ===
                          focusedWebContents.hostWebContents &&
                        webContentsInstance !== focusedWebContents
                    );
                  if (notionWebviewWebContents) {
                    focusedWebContents = notionWebviewWebContents;
                  }
                }
                focusedWebContents.toggleDevTools();
              }
            },
          },
          {
            label: escapeAmpersand(
              intl.formatMessage(menuMessages.toggleWindowDevTools)
            ),
            accelerator: isMac ? 'Shift+Alt+Command+I' : 'Alt+Ctrl+Shift+I',
            visible: false,
            click(menuItem, focusedWindow) {
              if (focusedWindow) {
                focusedWindow.webContents.toggleDevTools();
              }
            },
          },
          { type: 'separator' },
          {
            role: 'togglefullscreen',
            label: escapeAmpersand(
              intl.formatMessage(menuMessages.togglefullscreen)
            ),
          },
        ],
      },
      windowMenu = {
        role: 'windowMenu',
        label: escapeAmpersand(
          intl.formatMessage(menuMessages.windowMenuTitle)
        ),
        submenu: isMac
          ? [
              {
                role: 'minimize',
                label: escapeAmpersand(
                  intl.formatMessage(menuMessages.minimize)
                ),
              },
              {
                role: 'zoom',
                label: escapeAmpersand(intl.formatMessage(menuMessages.zoom)),
              },
              { type: 'separator' },
              {
                role: 'front',
                label: escapeAmpersand(intl.formatMessage(menuMessages.front)),
              },
            ]
          : [
              {
                role: 'minimize',
                label: escapeAmpersand(
                  intl.formatMessage(menuMessages.minimize)
                ),
              },
              {
                label: escapeAmpersand(
                  intl.formatMessage(menuMessages.maximize)
                ),
                click(item, focusedWindow) {
                  if (focusedWindow) {
                    if (focusedWindow.isMaximized()) {
                      focusedWindow.unmaximize();
                    } else {
                      focusedWindow.maximize();
                    }
                  }
                },
              },
              ...(tabsEnabled
                ? [
                    {
                      role: 'close',
                      label: escapeAmpersand(
                        intl.formatMessage(menuMessages.close)
                      ),
                    },
                  ]
                : []),
            ],
      },
      helpMenu = {
        role: 'help',
        label: escapeAmpersand(intl.formatMessage(menuMessages.helpTitle)),
        submenu: [
          {
            label: escapeAmpersand(intl.formatMessage(menuMessages.help)),
            click() {
              electron.shell.openExternal(config.default.baseURL + '/help');
            },
          },
        ],
      },
      appMenu = {
        role: 'appMenu',
        submenu: [
          {
            role: 'about',
            label: escapeAmpersand(intl.formatMessage(menuMessages.about)),
          },
          { type: 'separator' },
          {
            label: escapeAmpersand(intl.formatMessage(menuMessages.reset)),
            async click(item, focusedWindow) {
              await fs.remove(electron.app.getPath('userData'));
              electron.app.relaunch();
              electron.app.exit();
            },
          },
          { type: 'separator' },
          {
            role: 'services',
            label: escapeAmpersand(intl.formatMessage(menuMessages.services)),
          },
          { type: 'separator' },
          {
            role: 'hide',
            label: escapeAmpersand(intl.formatMessage(menuMessages.hide)),
          },
          {
            role: 'hideOthers',
            label: escapeAmpersand(intl.formatMessage(menuMessages.hideOthers)),
          },
          {
            role: 'unhide',
            label: escapeAmpersand(intl.formatMessage(menuMessages.unhide)),
          },
          ...(tabsEnabled
            ? [
                { type: 'separator' },
                {
                  role: 'quit',
                  label: escapeAmpersand(
                    intl.formatMessage(menuMessages.quitMac)
                  ),
                },
              ]
            : []),
        ],
      },
      template = [fileMenu, editMenu, viewMenu, windowMenu, helpMenu];
    if (isMac) template.unshift(appMenu);
    const menu = electron.Menu.buildFromTemplate(template);
    electron.Menu.setApplicationMenu(menu);
  };
};