'use strict'

const {Menu} = require('electron')
const EventEmitter = require('events').EventEmitter

const bindings = process.atomBinding('app')
const downloadItemBindings = process.atomBinding('download_item')
const app = bindings.app

Object.setPrototypeOf(app, EventEmitter.prototype)

app.setApplicationMenu = function (menu) {
  return Menu.setApplicationMenu(menu)
}

app.getApplicationMenu = function () {
  return Menu.getApplicationMenu()
}

app.commandLine = {
  appendSwitch: bindings.appendSwitch,
  appendArgument: bindings.appendArgument
}

if (process.platform === 'darwin') {
  app.dock = {
    bounce: function (type) {
      if (type == null) {
        type = 'informational'
      }
      return bindings.dockBounce(type)
    },
    cancelBounce: bindings.dockCancelBounce,
    setBadge: bindings.dockSetBadgeText,
    getBadge: bindings.dockGetBadgeText,
    hide: bindings.dockHide,
    show: bindings.dockShow,
    setMenu: bindings.dockSetMenu,
    setIcon: bindings.dockSetIcon
  }
}

var appPath = null

app.setAppPath = function (path) {
  appPath = path
}

app.getAppPath = function () {
  return appPath
}

// Routes the events to webContents.
var ref1 = ['login', 'certificate-error', 'select-client-certificate']
var fn = function (name) {
  return app.on(name, function (event, webContents, ...args) {
    return webContents.emit.apply(webContents, [name, event].concat(args))
  })
}
var i, len
for (i = 0, len = ref1.length; i < len; i++) {
  fn(ref1[i])
}

// Wrappers for native classes.
var wrapDownloadItem = function (downloadItem) {
  // downloadItem is an EventEmitter.
  Object.setPrototypeOf(downloadItem, EventEmitter.prototype)
}

downloadItemBindings._setWrapDownloadItem(wrapDownloadItem)

// Only one App object pemitted.
module.exports = app