#compdef auracle

local curcontext=$curcontext state line

_arguments -S \
  {--help,-h}'[Show help]' \
  '--version[Show software version]' \
  {--quiet,-q}'[Output less, when possible]' \
  {--recurse,-r}'[Recurse through dependencies on download]' \
  '--literal[Disallow regex in searches]' \
  '--searchby=[Change search-by dimension]: :(name name-desc maintainer depends makedepends optdepends checkdepends submitter provides conflicts replaces keywords groups comaintainers)' \
  '--color=[Control colored output]: :(auto never always)' \
  {--chdir=,-C+}'[Change directory before downloading]:directory:_files -/' \
  {--format=,-F+}'[Specify custom output for search and info]' \
  '(--rsort)--sort=[Sort results in ascending order]: :(name popularity votes firstsubmitted lastmodified)' \
  '(--sort)--rsort=[Sort results in descending order]: :(name popularity votes firstsubmitted lastmodified)' \
  '--resolve-deps=[Control depends resolution]: :(depends checkdepends makedepends)' \
  "--show-file=[File to dump with 'show' command]" \
  '(-): :->command' \
  '*:: :->option-or-argument'

case $state in

  (command)
    local -a commands
    commands=(
      'buildorder:Show build order'
      'clone:Clone or update git repos for packages'
      'info:Show detailed information'
      'rawinfo:Dump unformatted JSON for info query'
      'rawsearch:Dump unformatted JSON for search query'
      'resolve:Resolve dependencies'
      'search:Search for packages'
      'show:Dump package source file'
      'outdated:Check for updates for foreign packages'
      'update:Clone out of date foreign packages')
    _describe -t commands command commands
    ;;

  (option-or-argument)
    curcontext=${curcontext%:*}-$line[1]:
    local prefix=$PREFIX
    local -a packages
    case $line[1] in
      (buildorder|clone|info|rawinfo|show)
        [[ $compstate[quote] = [\'\"] ]] && prefix=$compstate[quote]$PREFIX$compstate[quote]
        packages=(${(f)"$(auracle search --quiet "${(Q)prefix}" 2> /dev/null)"})
        _describe -t packages package packages
        ;;
      (outdated|update)
        packages=(${(f)"$(pacman -Qmq 2> /dev/null)"})
        _describe -t packages package packages
        ;;
    esac
    ;;

esac

return 0
