#compdef brew-cask
#autoload

# Zsh Autocompletion script for Homebrew Cask
#   https://github.com/homebrew/brew

# Authors:
#   Patrick Stadler (https://github.com/pstadler)
#   Josh McKinney (https://github.com/joshka)

# only display the main commands (but enable completing aliases like 'ls')
zstyle -T ':completion:*:*:*:brew-cask:*' tag-order && \
	zstyle ':completion:*:*:*:brew-cask:*' tag-order 'commands'

__brew_cask() {
  [ -d "$(brew --repo homebrew/cask)" ] && brew cask $@
}

__brew_all_casks() {
  local -a list
  local expl
  local comp_cachename=brew_casks

  if ! _retrieve_cache $comp_cachename; then
    list=( $(brew search --casks) )
    _store_cache $comp_cachename list
  fi

  _wanted list expl 'all casks' compadd -a list
}

__brew_installed_casks() {
  local -a list
  local expl
  list=( $(__brew_cask list|sed 's/(!)//') )
  _wanted list expl 'installed casks' compadd -a list
}

__brew_cask_commands() {
  local -a commands
  commands=(
    'audit:verifies installability of Casks'
    'cat:dump raw source of the given Cask to the standard output'
    'create:creates the given Cask and opens it in an editor'
    'doctor:checks for configuration issues'
    'edit:edits the given Cask'
    'fetch:downloads remote application files to local cache'
    'home:opens the homepage of the given Cask'
    'info:displays information about the given Cask'
    'install:installs the given Cask'
    'list:with no args, lists installed Casks; given installed Casks, lists staged files'
    'outdated:list the outdated installed Casks'
    'reinstall:reinstalls the given Cask'
    'style:checks Cask style using RuboCop'
    'uninstall:uninstalls the given Cask'
    'upgrade:upgrade installed Casks with newer versions'
    'zap:zaps all files associated with the given Cask'
  )
  _describe -t commands "brew cask command" commands
}

__brew_cask_aliases() {
  local -a aliases
  aliases=(
    'dr'
    'homepage'
    'abv'
    'ls'
    '-S'
    'rm'
    'remove'
  )
  _describe -t commands "brew cask command aliases" aliases
}

__brew_cask_command() {
  local command="$1"
  local completion_func="_brew_cask_${command//-/_}"
  declare -f "$completion_func" >/dev/null && "$completion_func" && return
}

_brew_cask_abv() {
  _brew_cask_info
}

_brew_cask_audit() {
  __brew_all_casks
}

_brew_cask_cat() {
  __brew_all_casks
}

_brew_cask_cat() {
  __brew_all_casks
}

_brew_cask_create() {
  _arguments '*::token:'
}

_brew_cask_edit() {
  __brew_all_casks
}

_brew_cask_fetch() {
  _arguments : \
    '--force:force re-download even if the files are already cached' \
    '*::token:__brew_all_casks'
}

_brew_cask_home() {
  __brew_all_casks
}

_brew_cask_homepage() {
  __brew_cask_home
}

_brew_cask_info() {
  __brew_all_casks
}

_brew_cask_install() {
  _arguments : \
    '--force:re-install even if the Cask appears to be already present' \
    '--skip-cask-deps:skip any Cask dependencies' \
    '--require-sha:abort installation if the Cask does not have a checksum defined' \
    '*::token:__brew_all_casks'
}

_brew_cask_list() {
  _arguments : \
    '-1[format output in a single column]' \
    '-l[format as detailed list]' \
    '*::token:__brew_installed_casks'
}

_brew_cask_ls() {
  _brew_cask_list
}

_brew_cask_outdated() {
  _arguments : \
    '--greedy:also list Casks with auto_updates or version \:latest' \
    '*::token:__brew_installed_casks'
}

_brew_cask_remove() {
  _brew_cask_uninstall
}

_brew_cask_rm() {
  _brew_cask_uninstall
}

_brew_cask_style() {
  _arguments : \
    '--fix:auto-correct any style errors if possible' \
    '*::token:__brew_all_casks'
}

_brew_cask_uninstall() {
  _arguments : \
    '--force:uninstall even if the Cask does not appear to be present' \
    '*::token:__brew_installed_casks'
}

_brew_cask_upgrade() {
  _arguments : \
    '--force:upgrade even if Cask is not present, and --force the install' \
    '--greedy:also upgrade Casks with auto_updates or version \:latest' \
    '*::token:__brew_installed_casks'
}

_brew_cask_zap() {
  __brew_all_casks
}

_brew_cask()
{
  local curcontext="$curcontext" state state_descr line
  typeset -A opt_args

  _arguments -C : \
    '--verbose:Give additional feedback during installation.' \
    '--appdir=-:Target location for Applications. The default value is /Applications:' \
    '--colorpickerdir=-:Target location for Color Pickers. The default value is ~/Library/ColorPickers.' \
    '--prefpanedir=-:Target location for Preference Panes. The default value is ~/Library/PreferencePanes.' \
    '--qlplugindir=-:Target location for QuickLook Plugins. The default value is ~/Library/QuickLook.' \
    '--dictionarydir=-:Target location for Dictionaries. The default value is ~/Library/Dictionaries.' \
    '--fontdir=-:Target location for Fonts. The default value is ~/Library/Fonts.' \
    '--servicedir=-:Target location for Services. The default value is ~/Library/Services.' \
    '--input_methoddir=-:Target location for Input Methods. The default value is ~/Library/Input Methods.' \
    '--internet_plugindir=-:Target location for Internet Plugins. The default value is ~/Library/Internet Plug-Ins.' \
    '--audio_unit_plugindir=-:Target location for Audio Unit Plugins. The default value is ~/Library/Audio/Plug-Ins/Components.' \
    '--vst_plugindir=-:Target location for VST Plugins. The default value is ~/Library/Audio/Plug-Ins/VST.' \
    '--vst3_plugindir=-:Target location for VST3 Plugins. The default value is ~/Library/Audio/Plug-Ins/VST3.' \
    '--screen_saverdir=-:Target location for Screen Savers. The default value is ~/Library/Screen Savers.' \
    '--no-binaries:Do not link "helper" executables to /usr/local/bin.' \
    '--debug:Output debugging information of use to Cask authors and developers.' \
    ':command:->command' \
    '*::options:->options'

  case "$state" in
  (command)
    _alternative -C 'brew-cask' \
      'aliases:alias:__brew_cask_aliases' \
      'commands:command:__brew_cask_commands' ;;
  (options)
    __brew_cask_command "$line[1]" ;;
  esac
}

_brew_cask "$@"
