# Options read by onos-group for help message formatting and sanity checks.
GOPTS='install kill patch-vm push-keys uninstall'

# Tab completion settings for onos-group.
function _ogroup-opts () {
  local cur=${COMP_WORDS[COMP_CWORD]}
  if [ $COMP_CWORD -eq 1 ]; then
    COMPREPLY=( $( compgen -W "${GOPTS} help" -- $cur ) )
  fi
}

complete -F _ogroup-opts onos-group


# Tab completion settings for stc & stw
function _stc-opts () {
  local cur=${COMP_WORDS[COMP_CWORD]}
  if [ $COMP_CWORD -ge 1 ]; then
    COMPREPLY=( $( compgen -W "$(cd $ONOS_ROOT/tools/test/scenarios && ls -1 | sed 's/.xml//g')" -- $cur ) )
  fi
}

complete -F _stc-opts stc
complete -F _stc-opts stw
complete -F _stc-opts stcs


# Tab completion settings for stl
function _stl-opts () {
  local cur=${COMP_WORDS[COMP_CWORD]}
  if [ $COMP_CWORD -eq 1 ]; then
    COMPREPLY=( $( compgen -W "$(cd /tmp/stc && ls -1)" -- $cur ) )
  elif [ $COMP_CWORD -eq 2 ]; then
    COMPREPLY=( $( compgen -W "$(cd /tmp/stc/$3 && ls -1)" -- $cur ) )
  fi
}

complete -F _stl-opts stl


# Tab completion settings for cell
function _cell-opts () {
  local cur=${COMP_WORDS[COMP_CWORD]}
  if [ $COMP_CWORD -eq 1 ]; then
    COMPREPLY=( $( compgen -W "$(cd $ONOS_ROOT/tools/test/cells && ls -1) borrow return status" -- $cur ) )
  fi
}

complete -F _cell-opts cell vicell

# Tab completion settings for topo recipes
function _topo-opts () {
  local cur=${COMP_WORDS[COMP_CWORD]}
  if [ $COMP_CWORD -eq 1 ]; then
    COMPREPLY=( $( compgen -W "$(cd $ONOS_ROOT/tools/test/topos && ls -1 *.recipe | sed 's/\.recipe//g')" -- $cur ) )
  fi
}

complete -F _topo-opts topo


# Tab completion settings for onos-create-app.
function _ocapp-opts () {
  local cur=${COMP_WORDS[COMP_CWORD]}
  if [ $COMP_CWORD -eq 1 ]; then
    COMPREPLY=( $( compgen -W "app bundle ui ui2 uitab uitopo cli rest" -- $cur ) )
  fi
}

complete -F _ocapp-opts onos-create-app
