/**
 * 菜单栏模块
 */

'use strict';

class Menubar {

  constructor(electron, app, mainWindow) {

    const Menu = electron.Menu;
    const Tray = electron.Tray;
    const nativeImage = electron.nativeImage;
    const path = require('path');

    // 清空菜单栏
    Menu.setApplicationMenu(Menu.buildFromTemplate([]));
    // 监听重载菜单事件
    electron.ipcMain
      .on('quit', app.quit.bind(app))
      .on('menubar', this.reload.bind(this));

    this.electron = electron;
    this.app = app;
    this.Menu = Menu;
    this.Tray = Tray;
    this.nativeImage = nativeImage;
    this.path = path;
    this.trayIcon = null;
    this.mainWindow = mainWindow;
  }

  /**
   * 重新载入菜单
   * @param  {Object} event ipcMain对象
   * @param  {Object} LANG  语言模板
   * @return {[type]}       [description]
   */
  reload(event, LANG) {
    // 菜单模板
    const template = [
      {
        // 主菜单
        label: LANG['main']['title'],
        submenu: [
          {
            label: LANG['main']['about'],
            accelerator: 'Shift+CmdOrCtrl+I',
            click: event.sender.send.bind(event.sender, 'menubar', 'settings-about')
          }, {
            label: LANG['main']['language'],
            accelerator: 'Shift+CmdOrCtrl+L',
            click: event.sender.send.bind(event.sender, 'menubar', 'settings-language')
          }, {
            label: LANG['main']['aproxy'],
            accelerator: 'Shift+CmdOrCtrl+A',
            click: event.sender.send.bind(event.sender, 'menubar', 'settings-aproxy')
          }, {
            label: LANG['main']['display'],
            accelerator: 'Shift+CmdOrCtrl+D',
            click: event.sender.send.bind(event.sender, 'menubar', 'settings-display')
          }, {
            type: 'separator'
          }, {
            label: LANG['main']['encoders'],
            accelerator: 'Shift+CmdOrCtrl+E',
            click: event.sender.send.bind(event.sender, 'menubar', 'settings-encoders')
          }, {
            type: 'separator'
          }, {
            label: LANG['main']['settings'],
            accelerator: 'Shift+CmdOrCtrl+S',
            click: event.sender.send.bind(event.sender, 'menubar', 'settings')
          }, {
            type: 'separator'
          }, {
            label: LANG['main']['pluginStore'],
            accelerator: 'Shift+CmdOrCtrl+P',
            click: event.sender.send.bind(event.sender, 'menubar', 'plugin-store')
          }, {
            type: 'separator'
          }, {
            label: LANG['main']['quit'],
            accelerator: 'Command+Q',
            click: this.app.quit.bind(this.app)
          },
        ]
      }, {
        // 编辑
        label: LANG['edit']['title'],
        submenu: [
          {
            label: LANG['edit']['undo'], accelerator: 'CmdOrCtrl+Z', role: 'undo'
          }, {
            label: LANG['edit']['redo'], accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo'
          }, {
            type: 'separator'
          }, {
            label: LANG['edit']['cut'], accelerator: 'CmdOrCtrl+X', role: 'cut'
          }, {
            label: LANG['edit']['copy'], accelerator: 'CmdOrCtrl+C', role: 'copy'
          }, {
            label: LANG['edit']['paste'], accelerator: 'CmdOrCtrl+V', role: 'paste'
          }, {
            type: 'separator'
          }, {
            label: LANG['edit']['selectall'], accelerator: 'CmdOrCtrl+A', role: 'selectall'
          }
        ]
      }, {
        // 窗口
        label: LANG['window']['title'],
        submenu: [
          {
            label: LANG['window']['next'], accelerator: 'Shift+CmdOrCtrl+Right',
            click: event.sender.send.bind(event.sender, 'menubar', 'tabbar-next')
          }, {
            label: LANG['window']['prev'], accelerator: 'Shift+CmdOrCtrl+Left',
            click: event.sender.send.bind(event.sender, 'menubar', 'tabbar-prev')
          }, {
            type: 'separator'
          }, {
            label: LANG['window']['close'], accelerator: 'Shift+CmdOrCtrl+W',
            click: event.sender.send.bind(event.sender, 'menubar', 'tabbar-close')
          }
        ]
      }, {
        // 调试
        label: LANG['debug']['title'],
        submenu: [
          {
            label: LANG['debug']['restart'],
            accelerator: 'Shift+CmdOrCtrl+R',
            click: () => {
              // 在有多个窗口的时候，不刷新
              if (this.electron.BrowserWindow.getAllWindows().length > 1) {
                return;
              }
              this.mainWindow.webContents.reload();//.bind(this.mainWindow.webContents)
            }
          }, {
            label: LANG['debug']['devtools'],
            accelerator: 'Alt+CmdOrCtrl+J',
            click: this.mainWindow.webContents.toggleDevTools.bind(this.mainWindow.webContents)
          }
        ]
      }
    ];
    // 更新菜单栏
    this.Menu.setApplicationMenu(this.Menu.buildFromTemplate(template));
    if (this.trayIcon) {
      this.trayIcon.setContextMenu(this.Menu.buildFromTemplate([]));  
    }else{
      let image;
      if (process.platform === 'darwin' || process.platform === 'linux') {
         image = this.nativeImage.createFromPath(this.path.join(__dirname, '../static/imgs/tray-icon-mac-2.png'));
      }else{
        // windows下的Tray图标
        image = this.nativeImage.createFromPath(this.path.join(__dirname, '../static/imgs/tray-icon-win-colorful.ico'));
      }
      image.setTemplateImage(true);
      this.trayIcon = new this.Tray(image);
    }
    var trayMenuTemplate = [
      {
        label: LANG['tray']['show'],
        click: () => {
          this.mainWindow.show();
        }
      }, {
        label: LANG['tray']['hide'],
        click: () => {
          if (process.platform == 'darwin') {
            this.app.hide();
          }else{
            this.mainWindow.hide();
          }
        }
      }, {
        label: LANG['tray']['settings'],
        click: event.sender.send.bind(event.sender, 'menubar', 'settings')
      }, {
        label: LANG['tray']['about'],
        click: event.sender.send.bind(event.sender, 'menubar', 'settings-about')
      }, {
        type: 'separator'
      }, {
        label: LANG['tray']['quit'],
        click: this.app.quit.bind(this.app)
      }
    ];

    this.trayIcon.on('click', () => {
      if (process.platform == 'darwin') return;
      if (this.mainWindow.isVisible()) {
          this.mainWindow.hide();
      }else{
        this.mainWindow.show();
      }
    });

    this.trayIcon.setToolTip(LANG['tray']['tip']);

    this.trayIcon.setContextMenu(this.Menu.buildFromTemplate(trayMenuTemplate));

  }

}

module.exports = Menubar;
