#!/bin/bash

__contains_word () {
  local w word=$1; shift

  for w in "$@"; do
    [[ $w = "$word" ]] && return 0
  done

  return 1
}

_auracle() {
  local cur prev words cword split
  _init_completion -s || return

  local i verb comps
  local -A OPTS=(
         [STANDALONE]='--help -h --version --quiet -q --recurse -r --literal'
                [ARG]='-C --chdir --searchby --color --sort --rsort --show-file -F --format --resolve-deps'
  )

  if __contains_word "$prev" ${OPTS[ARG]}; then
    case $prev in
      '--color')
        comps='always never auto'
        ;;
      '--searchby')
        comps='name name-desc maintainer depends makedepends optdepends
               checkdepends submitter provides conflicts replaces
               keywords groups maintainers'
        ;;
      '--sort'|'--rsort')
        comps="name votes popularity firstsubmitted lastmodified"
        ;;
      '-C'|'--chdir')
        comps=$(compgen -A directory -- "$cur" )
        compopt -o filenames
        ;;
      '--resolve-deps')
        local c=({^,!,+,}{check,make,}depends)
        comps="${c[*]}"
        ;;
    esac

    COMPREPLY=($(compgen -W '$comps' -- "$cur"))
    return 0
  fi

  if [[ "$cur" = -* ]]; then
    COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
    return 0
  fi

  local -A VERBS=(
      [AUR_PACKAGES]='buildorder clone show info rawinfo'
    [LOCAL_PACKAGES]='outdated update'
              [NONE]='search rawsearch resolve'
  )

  for ((i=0; i < COMP_CWORD; i++)); do
    if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
      ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
      verb=${COMP_WORDS[i]}
      break
    fi
  done


  if [[ -z $verb ]]; then
    comps=${VERBS[*]}
  elif __contains_word "$verb" ${VERBS[AUR_PACKAGES]}; then
    if (( ${#cur} >= 2 )); then
      comps=$(auracle search --quiet "$cur" 2>/dev/null)
    fi
  elif __contains_word "$verb" ${VERBS[LOCAL_PACKAGES]}; then
    comps=$(pacman -Qmq)
  fi

  COMPREPLY=($(compgen -W '$comps' -- "$cur"))
  return 0
}

complete -F _auracle auracle
