# bash completion for wb_command

#  Copyright (C) 2016  Washington University School of Medicine
#
#  Permission is hereby granted, free of charge, to any person obtaining
#  a copy of this software and associated documentation files (the
#  "Software"), to deal in the Software without restriction, including
#  without limitation the rights to use, copy, modify, merge, publish,
#  distribute, sublicense, and/or sell copies of the Software, and to
#  permit persons to whom the Software is furnished to do so, subject to
#  the following conditions:
#
#  The above copyright notice and this permission notice shall be included
#  in all copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
#  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
#  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
#  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
#  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#put this file in (or link to it from) /etc/bash_completion.d or copy contents to ~/.bash_completion

function _wb_command()
{
    #debug must be "false" or "true", because it *executes* it (because i'm lazy)
    local debug=false
    COMPREPLY=()
    #use bash-completion's hacks to deal with the word splitting we don't want
    local cur words cword
    #use only space for splitting
    _get_comp_words_by_ref -n "'"'"><=;|&(:' cur words cword
    #NOTE: cur has the partial word that is *before* the cursor, but words has the entire word under the cursor
    #wb_command doesn't need to know what the current partial word is, it spits out space-separated glob patterns and the like
    #but we will need it in compgen afterwards
    local wbopts=""
    if ! shopt -q extglob
    then
        #bash-completion enables extglob, but work around it if it isn't set
        wbopts="-noextglob"
    fi
    #only give wb_command the options coming *before* the one to complete, not even the partial word to complete
    #also don't include the executable name ${words[0]}
    $debug && echo
    $debug && echo "exe call: wb_command -completion $wbopts ${words[@]:1:$((cword - 1))}"
    local exereplyraw=`wb_command -completion $wbopts "${words[@]:1:$((cword - 1))}" 2> /dev/null`
    local exestatus=$?
    if [[ $exestatus != 0 ]]
    then
        return 1
    fi
    $debug && echo "exereplayraw: $exereplyraw"
    #need to cause backslashes to escape spaces...
    local -a exereply
    IFS=' ' read -a exereply <<< "$exereplyraw"
    $debug && echo "exereply: ${exereply[@]}"
    for ((i = 0; i < ${#exereply[@]}; i += 2))
    do
        $debug && echo "key: ${exereply[$i]}"
        $debug && echo "value: ${exereply[$((i + 1))]}"
        case "${exereply[$i]}" in
            fileglob)
                #bash_completion itself uses -f -X for file extension matching
                #using -G requires manually adding $cur before the pattern
                COMPREPLY+=(`compgen -f -X "!${exereply[$((i + 1))]}" -- "$cur"`)
            ;;
            wordlist)
                #for the things accepted as bool, maybe other uses - happens to function like "option" for now
                COMPREPLY+=(`compgen -W "${exereply[$((i + 1))]}" -- "$cur"`)
            ;;
        esac
    done
    $debug && echo "COMPREPLY: ${COMPREPLY[@]}"
    return 0
}

complete -o filenames -o bashdefault -o default -F _wb_command wb_command

#completion for wb_shortcuts - could be a separate file, but this is simpler

function _wb_shortcuts ()
{
    COMPREPLY=()
    #use bash-completion's hacks to deal with the word splitting we don't want
    #we can only complete the first word, so only get cur and cword
    local cur cword
    #use only space for splitting
    _get_comp_words_by_ref -n "'"'"><=;|&(:' cur cword
    if ((cword != 1))
    then
        return 0
    fi
    local -a switches
    readarray -t switches < <(wb_shortcuts -list-functions | awk '{print $1}')
    COMPREPLY=(`compgen -W "${switches[*]}" -- "$cur"`)
}

complete -o filenames -o bashdefault -o default -F _wb_shortcuts wb_shortcuts
