# vim:fdm=marker foldlevel=0 tabstop=2 shiftwidth=2 filetype=bash
# This file is in the public domain.

_arch_compgen() {
  local i r
  COMPREPLY=($(compgen -W '$*' -- "$cur"))
  for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do
    for r in ${!COMPREPLY[@]}; do
      if [[ ${COMP_WORDS[i]} = ${COMPREPLY[r]} ]]; then
        unset 'COMPREPLY[r]'; break
      fi
    done
  done
}

_arch_ptr2comp() {
  local list= x y
  for x; do
    for y in '0 --' '1 -'; do
      eval 'set -- ${'$x'[${y% *}]}'
      list+=\ ${@/#/${y#* }}
    done
  done
  _arch_compgen $list
}

_arch_incomp() {
  local r="\s-(-${1#* }\s|\w*${1% *})"; [[ $COMP_LINE =~ $r ]]
}

_pacman_keyids() {
  \pacman-key --list-keys 2>/dev/null | awk '
    $1 == "pub" {
      # key id
      split($2, a, "/"); print a[2]
    }
    $1 == "uid" {
      # email
      if (match($NF, /<[^>]+>/))
        print substr($NF, RSTART + 1, RLENGTH - 2)
    }'
}

_pacman_pkg() {
  _arch_compgen "$(
    if [[ $2 ]]; then
      \pacman -$1 2>/dev/null | \cut -d' ' -f1 | \sort -u
    else
      \pacman -$1 2>/dev/null
    fi
  )"
}

_yay() {
  local common core cur database prev query remove sync upgrade yays print o
  COMPREPLY=()
  _get_comp_words_by_ref cur prev
  database=('asdeps asexplicit')
  files=('list machinereadable owns search refresh regex' 'l o s x y')
  query=('changelog check deps explicit file foreign groups info list owns
          search unrequired upgrades' 'c e g i k l m o p s t u')
  remove=('cascade dbonly nodeps assume-installed nosave print recursive unneeded' 'c n p s u')
  sync=('asdeps asexplicit clean dbonly downloadonly force groups ignore ignoregroup
         info list needed nodeps assume-installed print refresh recursive search sysupgrade'
        'c g i l p s u w y')
  upgrade=('asdeps asexplicit force needed nodeps assume-installed print recursive' 'p')
  yays=('clean gendb' 'c')
  print=('complete defaultconfig config numberupgrades stats upgrades' 'c d g n
  s u')
  common=('arch cachedir color config confirm dbpath debug gpgdir help hookdir logfile
           noconfirm noprogressbar noscriptlet quiet save mflags buildir editor
           makepkg pacman tar git gpg gpgflags config requestsplitn sudoloop nosudoloop
           redownload noredownload redownloadall rebuild rebuildall rebuildtree norebuild
	   sortby answerclean answeredit answerupgrade noanswerclean noansweredit
	   noanswerupgrade root verbose' 'b d h q r v')
  core=('database files help query remove sync upgrade version' 'D F Q R S U V h')

  for o in 'D database' 'F files' 'Q query' 'R remove' 'S sync' 'U upgrade' 'Y yays' 'P print'; do
    _arch_incomp "$o" && break
  done

  if [[ $? != 0 ]]; then
    _arch_ptr2comp core
  elif [[ ! $prev =~ ^-\w*[Vbhr] &&
    ! $prev = --@(cachedir|color|config|dbpath|help|hookdir|gpgdir|logfile|root|version) ]]
  then
    [[ $cur = -* ]] && _arch_ptr2comp ${o#* } common ||
      case ${o% *} in
      D|R)
          _pacman_pkg Qq;;
      F)
          _arch_incomp 'l list'   && _pacman_pkg Slq;
          ;;
      Q)
        { _arch_incomp 'g groups' && _pacman_pkg Qg sort; }    ||
        { _arch_incomp 'p file'   && _pacman_file; }           ||
          _arch_incomp 'o owns'   || _arch_incomp 'u upgrades' ||
          _pacman_pkg Qq;;
      S)
        { _arch_incomp 'g groups' && _pacman_pkg Sg; }      ||
          { _arch_incomp 'l list'   && _arch_compgen "$(yay -Pc | \sort -u)"; } ||
          _arch_compgen "$(yay -Pc )";;
      U)
          _pacman_file;;
      esac
  fi
  true
}

_pacman_file() {
  compopt -o filenames; _filedir 'pkg.tar*'
}

complete -F _yay -o default yay

# ex:et ts=2 sw=2 ft=sh
