#compdef omz

local -a cmds subcmds
cmds=(
  'changelog:Print the changelog'
  'help:Usage information'
  'plugin:Manage plugins'
  'pr:Manage Oh My Zsh Pull Requests'
  'reload:Reload the current zsh session'
  'shop:Open the Oh My Zsh shop'
  'theme:Manage themes'
  'update:Update Oh My Zsh'
  'version:Show the version'
)

if (( CURRENT == 2 )); then
  _describe 'command' cmds
elif (( CURRENT == 3 )); then
  case "$words[2]" in
    changelog) local -a refs
      refs=("${(@f)$(builtin cd -q "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}")
      _describe 'command' refs ;;
    plugin) subcmds=(
      'disable:Disable plugin(s)'
      'enable:Enable plugin(s)'
      'info:Get plugin information'
      'list:List plugins'
      'load:Load plugin(s)'
    )
      _describe 'command' subcmds ;;
    pr) subcmds=('clean:Delete all Pull Request branches' 'test:Test a Pull Request')
      _describe 'command' subcmds ;;
    theme) subcmds=('list:List themes' 'set:Set a theme in your .zshrc file' 'use:Load a theme')
      _describe 'command' subcmds ;;
  esac
elif (( CURRENT == 4 )); then
  case "${words[2]}::${words[3]}" in
    plugin::(disable|enable|load))
      local -aU valid_plugins

      if [[ "${words[3]}" = disable ]]; then
        # if command is "disable", only offer already enabled plugins
        valid_plugins=($plugins)
      else
        valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
        # if command is "enable", remove already enabled plugins
        [[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
      fi

      _describe 'plugin' valid_plugins ;;
    plugin::info)
      local -aU plugins
      plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
      _describe 'plugin' plugins ;;
    plugin::list)
      local -a opts
      opts=('--enabled:List enabled plugins only')
      _describe -o 'options' opts ;;
    theme::(set|use))
      local -aU themes
      themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
      _describe 'theme' themes ;;
  esac
elif (( CURRENT > 4 )); then
  case "${words[2]}::${words[3]}" in
    plugin::(enable|disable|load))
      local -aU valid_plugins

      if [[ "${words[3]}" = disable ]]; then
        # if command is "disable", only offer already enabled plugins
        valid_plugins=($plugins)
      else
        valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
        # if command is "enable", remove already enabled plugins
        [[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
      fi

      # Remove plugins already passed as arguments
      # NOTE: $(( CURRENT - 1 )) is the last plugin argument completely passed, i.e. that which
      # has a space after them. This is to avoid removing plugins partially passed, which makes
      # the completion not add a space after the completed plugin.
      local -a args
      args=(${words[4,$(( CURRENT - 1))]})
      valid_plugins=(${valid_plugins:|args})

      _describe 'plugin' valid_plugins ;;
  esac
fi

return 0
