'use strict'

const child = require('mz/child_process')
const debug = require('debug')('electron-packager')
const Walker = require('pruner').Walker

const knownPackageManagers = ['npm', 'cnpm', 'yarn']

function pruneCommand (packageManager) {
  switch (packageManager) {
    case 'npm':
    case 'cnpm':
      return `${packageManager} prune --production`
    case 'yarn':
      return `${packageManager} install --production --no-bin-links --no-lockfile`
  }
}

function pruneModules (opts, appPath) {
  if (opts.packageManager === false) {
    const walker = new Walker(appPath)
    return walker.prune()
  } else {
    const packageManager = opts.packageManager || 'npm'

    /* istanbul ignore if */
    if (packageManager === 'cnpm' && process.platform === 'win32') {
      return Promise.reject(new Error('cnpm support does not currently work with Windows, see: https://github.com/electron-userland/electron-packager/issues/515#issuecomment-297604044'))
    }

    const command = pruneCommand(packageManager)

    if (command) {
      debug(`Pruning modules via: ${command}`)
      return child.exec(command, { cwd: appPath })
    } else {
      return Promise.reject(new Error(`Unknown package manager "${packageManager}". Known package managers: ${knownPackageManagers.join(', ')}`))
    }
  }
}

module.exports = {
  pruneCommand: pruneCommand,
  pruneModules: pruneModules
}