text: // @flow
  import { app, Menu, shell, BrowserWindow } from 'electron';
  
  export default class MenuBuilder {
    mainWindow: BrowserWindow;
  
    constructor(mainWindow: BrowserWindow) {
      this.mainWindow = mainWindow;
    }
  
    buildMenu() {
      if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') {
        this.setupDevelopmentEnvironment();
      }
  
      let template;
  
      if (process.platform === 'darwin') {
        template = this.buildDarwinTemplate();
      } else {
        template = this.buildDefaultTemplate();
      }
  
      const menu = Menu.buildFromTemplate(template);
      Menu.setApplicationMenu(menu);
  
      return menu;
    }
  
    setupDevelopmentEnvironment() {
      this.mainWindow.openDevTools();
      this.mainWindow.webContents.on('context-menu', (e, props) => {
        const { x, y } = props;
  
        Menu
          .buildFromTemplate([{
            label: 'Inspect element',
            click: () => {
              this.mainWindow.inspectElement(x, y);
            }
          }])
          .popup(this.mainWindow);
      });
    }
  
    buildDarwinTemplate() {
      const subMenuAbout = {
        label: 'dPay',
        submenu: [
          { label: 'About dPay Wallet', selector: 'orderFrontStandardAboutPanel:' },
          { type: 'separator' },
          { label: 'Services', submenu: [] },
          { type: 'separator' },
          { label: 'Hide dPay Wallet', accelerator: 'Command+H', selector: 'hide:' },
          { label: 'Hide Others', accelerator: 'Command+Shift+H', selector: 'hideOtherApplications:' },
          { label: 'Show All', selector: 'unhideAllApplications:' },
          { type: 'separator' },
          { label: 'Quit', accelerator: 'Command+Q', click: () => { app.quit(); } }
        ]
      };
      const subMenuEdit = {
        label: 'Edit',
        submenu: [
          { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' },
          { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' },
          { type: 'separator' },
          { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' },
          { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' },
          { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' },
          { label: 'Select All', accelerator: 'Command+A', selector: 'selectAll:' }
        ]
      };
      const subMenuViewDev = {
        label: 'View',
        submenu: [
          { label: 'Reload', accelerator: 'Command+R', click: () => { this.mainWindow.webContents.reload(); } },
          { label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); } },
          { label: 'Toggle Developer Tools', accelerator: 'Alt+Command+I', click: () => { this.mainWindow.toggleDevTools(); } }
        ]
      };
      // const subMenuViewProd = {
      //   label: 'View',
      //   submenu: [
      //     { label: 'Reload', accelerator: 'Command+R', click: () => { this.mainWindow.webContents.reload(); } },
      //     { label: 'Toggle Full Screen', accelerator: 'Ctrl+Command+F', click: () => { this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen()); } },
      //     { label: 'Toggle Developer Tools', accelerator: 'Alt+Command+I', click: () => { this.mainWindow.toggleDevTools(); } }
      //   ]
      // };
      const subMenuWindow = {
        label: 'Window',
        submenu: [
          { label: 'Minimize', accelerator: 'Command+M', selector: 'performMiniaturize:' },
          { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' },
          { type: 'separator' },
          { label: 'Bring All to Front', selector: 'arrangeInFront:' }
        ]
      };
      const subMenuHelp = {
        label: 'Help',
        submenu: [
          { label: 'Source Code (Github)', click() { shell.openExternal('https://github.com/dpays/dpay-desktop'); } },
          { label: 'Report Bug (Github)', click() { shell.openExternal('https://github.com/dpays/dpay-desktop/issues'); } },
          { label: 'Releases (Github)', click() { shell.openExternal('https://github.com/dpays/dpay-desktop/releases'); } }
        ]
      };
  
      // const subMenuView = process.env.NODE_ENV === 'development'
      //   ? subMenuViewDev
      //   : subMenuViewProd;
  
      const subMenuView = subMenuViewDev;
  
      return [
        subMenuAbout,
        subMenuEdit,
        subMenuView,
        subMenuWindow,
        subMenuHelp
      ];
    }
  
    buildDefaultTemplate() {
      const templateDefault = [{
        label: '&File',
        submenu: [{
          label: '&Open',
          accelerator: 'Ctrl+O'
        }, {
          label: '&Close',
          accelerator: 'Ctrl+W',
          click: () => {
            this.mainWindow.close();
          }
        }]
      }, {
        label: '&View',
        submenu: (process.env.NODE_ENV === 'development') ? [{
          label: '&Reload',
          accelerator: 'Ctrl+R',
          click: () => {
            this.mainWindow.webContents.reload();
          }
        }, {
          label: 'Toggle &Full Screen',
          accelerator: 'F11',
          click: () => {
            this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen());
          }
        }, {
          label: 'Toggle &Developer Tools',
          accelerator: 'Alt+Ctrl+I',
          click: () => {
            this.mainWindow.toggleDevTools();
          }
        }] : [{
          label: '&Reload',
          accelerator: 'Ctrl+R',
          click: () => {
            this.mainWindow.webContents.reload();
          }
        }, {
          label: 'Toggle &Full Screen',
          accelerator: 'F11',
          click: () => {
            this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen());
          }
        }, {
          label: 'Toggle &Developer Tools',
          accelerator: 'Alt+Ctrl+I',
          click: () => {
            this.mainWindow.toggleDevTools();
          }
        }]
      }, {
        label: 'Help',
        submenu: [
          { label: 'Source Code (Github)', click() { shell.openExternal('https://github.com/dpays/dpay-desktop'); } },
          { label: 'Report Bug (Github)', click() { shell.openExternal('https://github.com/dpays/dpay-desktop/issues'); } },
          { label: 'Releases (Github)', click() { shell.openExternal('https://github.com/dpays/dpay-desktop/releases'); } }
        ]
      }];
  
      return templateDefault;
    }
  }
  