'use strict'

var MenuItem, methodInBrowserWindow, nextCommandId, rolesMap

nextCommandId = 0

// Maps role to methods of webContents
rolesMap = {
  undo: 'undo',
  redo: 'redo',
  cut: 'cut',
  copy: 'copy',
  paste: 'paste',
  pasteandmatchstyle: 'pasteAndMatchStyle',
  selectall: 'selectAll',
  minimize: 'minimize',
  close: 'close',
  delete: 'delete'
}

// Maps methods that should be called directly on the BrowserWindow instance
methodInBrowserWindow = {
  minimize: true,
  close: true
}

MenuItem = (function () {
  MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio']

  function MenuItem (options) {
    var click, ref
    const Menu = require('electron').Menu
    click = options.click
    this.selector = options.selector
    this.type = options.type
    this.role = options.role
    this.label = options.label
    this.sublabel = options.sublabel
    this.accelerator = options.accelerator
    this.icon = options.icon
    this.enabled = options.enabled
    this.visible = options.visible
    this.checked = options.checked
    this.submenu = options.submenu
    if ((this.submenu != null) && this.submenu.constructor !== Menu) {
      this.submenu = Menu.buildFromTemplate(this.submenu)
    }
    if ((this.type == null) && (this.submenu != null)) {
      this.type = 'submenu'
    }
    if (this.type === 'submenu' && ((ref = this.submenu) != null ? ref.constructor : void 0) !== Menu) {
      throw new Error('Invalid submenu')
    }
    this.overrideReadOnlyProperty('type', 'normal')
    this.overrideReadOnlyProperty('role')
    this.overrideReadOnlyProperty('accelerator')
    this.overrideReadOnlyProperty('icon')
    this.overrideReadOnlyProperty('submenu')
    this.overrideProperty('label', '')
    this.overrideProperty('sublabel', '')
    this.overrideProperty('enabled', true)
    this.overrideProperty('visible', true)
    this.overrideProperty('checked', false)
    if (MenuItem.types.indexOf(this.type) === -1) {
      throw new Error('Unknown menu type ' + this.type)
    }
    this.commandId = ++nextCommandId
    this.click = (focusedWindow) => {
      // Manually flip the checked flags when clicked.
      var methodName, ref1, ref2
      if ((ref1 = this.type) === 'checkbox' || ref1 === 'radio') {
        this.checked = !this.checked
      }
      if (this.role && rolesMap[this.role] && process.platform !== 'darwin' && (focusedWindow != null)) {
        methodName = rolesMap[this.role]
        if (methodInBrowserWindow[methodName]) {
          return focusedWindow[methodName]()
        } else {
          return (ref2 = focusedWindow.webContents) != null ? ref2[methodName]() : void 0
        }
      } else if (typeof click === 'function') {
        return click(this, focusedWindow)
      } else if (typeof this.selector === 'string' && process.platform === 'darwin') {
        return Menu.sendActionToFirstResponder(this.selector)
      }
    }
  }

  MenuItem.prototype.overrideProperty = function (name, defaultValue) {
    if (defaultValue == null) {
      defaultValue = null
    }
    this[name] != null ? this[name] : this[name] = defaultValue

    return this[name]
  }

  MenuItem.prototype.overrideReadOnlyProperty = function (name, defaultValue) {
    if (defaultValue == null) {
      defaultValue = null
    }
    if (this[name] == null) {
      this[name] = defaultValue
    }
    return Object.defineProperty(this, name, {
      enumerable: true,
      writable: false,
      value: this[name]
    })
  }

  return MenuItem
})()

module.exports = MenuItem