#compdef tugboat
#autoload

# Tugboat zsh autocompletion


local -a _commands
_commands=(
  'add-key:[NAME] Upload an ssh public key.'
  'authorize:Authorize a DigitalOcean account with tugboat.'
  'create:[NAME] Create a droplet.'
  'destroy:[FUZZY_NAME] Destroy a droplet.'
  'destroy_image:[FUZZY_NAME] Destroy an image.'
  'droplets:Retrieve a list of your droplets.'
  'halt:[FUZZY_NAME] Shutdown a droplet.'
  'help:[COMMAND] Describe commands or a specific command.'
  'images:Retrieve a list of your images.'
  'info:[FUZZY_NAME] [OPTIONS] Show a droplets information.'
  'info_image:[FUZZY_NAME] [OPTIONS] Show an images information.'
  'keys:Show available SSH keys.'
  'password-reset:[FUZZY_NAME] Reset root password.'
  'rebuild:[FUZZY_NAME] [IMAGE_NAME] Rebuild a droplet.'
  'regions:Show regions.'
  'resize:[FUZZY_NAME -s, --size=N] Resize a droplet.'
  'restart:[FUZZY_NAME] Restart a droplet.'
  'sizes:Show available droplet sizes.'
  'snapshot:[SNAPSHOT_NAME] [FUZZY_NAME] [OPTIONS] Queue a snapshot of the droplet.'
  'ssh:[FUZZY_NAME] SSH into a droplet.'
  'start:[FUZZY_NAME] Start a droplet.'
  'verify:Check your DigitalOcean credentials.'
  'version:Show version.'
  'wait:[FUZZY_NAME] Wait for a droplet to reach a state.'
)

local -a _create_arguments
_create_arguments=(
  '-s:[--size=N] The size_id of the droplet'
  '-i:[--image=N] The image_id of the droplet'
  '-r:[--region=N] The region_id of the droplet'
  '-k:[--keys=KEYS] A comma separated list of SSH key ids to add to the droplet'
  '-p:[--private-networking] Enable private networking on the droplet'
  '-b:[--backups-enabled] Enable backups on the droplet'
  '-q:[--quiet]'
)

__task_list ()
{
  local expl
  declare -a tasks

  arguments=(add-key authorize create destroy destroy_image droplets halt help images info info_image keys password-reset rebuild regions resize restart sizes snapshot ssh start verify version wait)

  _wanted tasks expl 'help' compadd $arguments
}

__droplets_list ()
{
    _wanted application expl 'command' compadd $(command tugboat droplets | cut -d " " -f1)
}

__tugboat-create ()
{
    local curcontext="$curcontext" state line
    typeset -A opt_args

    _arguments -C \
        ':command:->command' \
        '*::options:->options'

    case $state in
        (command)
            _describe -t commands "gem subcommand" _create_arguments
            return
        ;;
    esac
}

local curcontext="$curcontext" state line
typeset -A opt_args

_arguments -C \
    ':command:->command' \
    '*::options:->options'

case $state in
  (command)
    _describe -t commands "gem subcommand" _commands
    return
  ;;

  (options)
    case $line[1] in
      (help)
        _arguments ':feature:__task_list'
      ;;

      (ssh)
        _arguments ':feature:__droplets_list'
      ;;

      (create)
        _arguments ':feature:__tugboat-create'
      ;;
    esac
  ;;
esac