#compdef epm

_epm() {
  typeset -A opt_args
  local context state line curcontext="$curcontext"

  local ret=1

  _arguments -C \
    '(- 1 *)--help[show usage]' \
    '1:cmd:->cmds' \
    '*::arg:->args' \
  && ret=0

  case "$state" in
    cmds)
      local commands; commands=(
        'play:install the application'
        'install:install packages'
        'remove:remove packages'
        'full-upgrade:do full upgrade'
        'update:update remote package repository databases'
      )
      _describe -t commands 'command' commands && ret=0
    ;;
    args)
      curcontext="${curcontext%:*:*}:epm-cmd-${words[1]}:"
      case "${words[1]}" in
        play)
          if [[ ${words[CURRENT]} == -* ]]; then
            _arguments \
              '--remove[remove a play package]' \
              '--update[update a play package]' \
              '--list[list play packages]' \
              '--list-all[list all play packages]' \
              '--list-scripts[list play package scripts]' \
              '--short[short format]' \
              '--installed[list installed play packages]' \
              '--product-alternatives[list product alternatives]' \
              '--quiet[quiet mode]' \
          && ret=0
          else
            _epm_play_packages && ret=0
          fi
        ;;
        install)
          _epm_available_packages && ret=0
        ;;
        remove)
          _epm_installed_packages && ret=0
        ;;
        full-upgrade)
          _arguments \
            '--help[show help]' \
            '--verbose[verbose mode]' \
            '--version[show version]' \
            '--quiet[quiet mode]' \
            && ret=0
        ;;
        update)
          _arguments \
            '--all[update all installed packages]' \
            '1:package:->_epm_installed_packages' \
          && ret=0
        ;;
      esac
    ;;
  esac

  return $ret
}

_epm_play_packages() {
  local play_packages 
  play_packages=( $(epm play --list-all --quiet --short) )
  _describe -t play-packages 'play package' play_packages "$@"
}

_epm_available_packages() {
  local available_packages 
  available_packages=( $(epm list --available --quiet --short --direct) )
  _describe -t available-packages 'available package' available_packages "$@"
}

_epm_installed_packages() {
  local installed_packages 
  installed_packages=( $(epm list --installed --quiet --short --direct) )
  _describe -t installed-packages 'installed package' installed_packages "$@"
}

compdef _epm epm