text: 'use strict'
  
  const cli = require('heroku-cli-util')
  const co = require('co')
  const configCmd = require('./config')
  const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
  
  function check (val, message) {
    if (!val) throw new Error(`${message}.\nUSAGE: heroku spaces:vpn:wait --space my-space vpn-connection-name`)
  }
  
  function * run (context, heroku) {
    const space = context.flags.space
    check(space, 'Space name required')
    const name = context.flags.name || context.args.name
    check(name, 'VPN connection name required')
  
    const interval = (typeof context.flags.interval !== 'undefined' ? context.flags.interval : 10) * 1000
    const timeout = (typeof context.flags.timeout !== 'undefined' ? context.flags.timeout : 20 * 60) * 1000
    const deadline = new Date(new Date().getTime() + timeout)
    const spinner = new cli.Spinner({text: `Waiting for VPN Connection ${cli.color.green(name)} to allocate...`})
  
    spinner.start()
  
    let lib = require('../../lib/vpn-connections')(heroku)
    let info = {}
    do {
      info = yield lib.getVPNConnection(space, name)
  
      if ((new Date()).getTime() >= deadline) {
        throw new Error('Timeout waiting for VPN to become allocated.')
      }
  
      if (info.status === 'failed') {
        throw new Error(info.status_message)
      }
  
      yield wait(interval)
    } while (info.status !== 'active')
  
    spinner.stop('done\n')
  
    var config = yield lib.getVPNConnection(space, name)
    configCmd.displayVPNConfigInfo(space, name, config)
  }
  
  module.exports = {
    topic: 'spaces',
    command: 'vpn:wait',
    description: 'wait for VPN Connection to be created',
    needsApp: false,
    needsAuth: true,
    args: [{name: 'name', optional: true, hidden: true}],
    flags: [
      {name: 'space', char: 's', hasValue: true, description: 'space the vpn connection belongs to'},
      {name: 'name', char: 'n', hasValue: true, description: 'name or id of the vpn connection to wait for'},
      {name: 'json', description: 'output in json format'},
      {name: 'interval', char: 'i', hasValue: true, description: 'seconds to wait between poll intervals'},
      {name: 'timeout', char: 't', hasValue: true, description: 'maximum number of seconds to wait'}
    ],
    run: cli.command(co.wrap(run))
  }
  