#
# bash completion for ejabberdctl
#
# For installation and details see:
# https://docs.ejabberd.im/admin/guide/managing/#bash-completion
#

get_help()
{
    local CACHE_BASE=/tmp/ejabberd_bash_completion
    local DATESTRING=`date +%F-%H`
    local CACHE=$CACHE_BASE.$DATESTRING
    local CACHE_COMS=$CACHE.coms
    local CACHE_TAGS=$CACHE.tags
    if [[ ! -f $CACHE_COMS ]] ; then
        rm -f $CACHE_BASE.*
        [ -f $CACHE_COMS ] || ejabberdctl $CTLARGS           | sed "s|\x1B\[[0-9]*m||g" | grep "^  [a-z]" | awk '{print $1}' | xargs >$CACHE_COMS
        [ -f $CACHE_TAGS ] || ejabberdctl $CTLARGS help tags | sed "s|\x1B\[[0-9]*m||g" | grep "^  [a-z]" | awk '{print $1}' | xargs >$CACHE_TAGS
    fi
    if [[ $? == 2 ]] || [[ -f $CACHE_COMS ]] ; then
        ISRUNNING=1
        runningcommands=`cat $CACHE_COMS`
        runningtags=`cat $CACHE_TAGS`
    fi
}

_ejabberdctl()
{
    local cur prev
    local ISRUNNING=0
    local runningcommands

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    local startcoms="start foreground foreground-quiet live debug etop iexdebug iexlive ping started stopped"
    local startpars="--config-dir --config --ctl-config --logs --node --spool"

    local i=1
    local CTLARGS=""
    while [ $i -lt $COMP_CWORD ] ; do
        local PARAM="${COMP_WORDS[i]}"
        i=$((i+1))
        case $PARAM in
            --*)
                CTLARGS="--node ${COMP_WORDS[i]}"
                i=$((i+1)) ;;
            *) break ;;
        esac
    done

    case "${prev##*/}" in
        ejabberdctl)
            # This clause matches even when calling `/sbin/ejabberdctl` thanks to the ##*/ in the case
            get_help
            COMPREPLY=($(compgen -W "--node ${startpars} ${startcoms} ${runningcommands}" -- $cur))
            return 0
            ;;
        start|live)
            COMPREPLY=($(compgen -W "--node ${startpars}" -- $cur))
            return 0
            ;;
        debug)
            COMPREPLY=($(compgen -W "--node" -- $cur))
            return 0
            ;;
        help)
            get_help
            COMPREPLY=($(compgen -W "${runningcommands} ${runningtags}" -- $cur))
            return 0
            ;;
        --node)
            RUNNINGNODES=`epmd -names | grep name | awk '{print $2"@localhost"}' | xargs`
            COMPREPLY=($(compgen -W "$RUNNINGNODES" -- $cur))
            return 0
            ;;
        --config|--ctl-config)
            _filedir '?(u)cfg'
            return 0
            ;;
        --config-dir|--logs|--spool)
            _filedir
            return 0
            ;;
        *)
            prev2="${COMP_WORDS[COMP_CWORD-2]}"
            get_help
            if [[ "$prev2" == --* ]]; then
                COMPREPLY=($(compgen -W "--node ${startpars} ${startcoms} ${runningcommands}" -- $cur))
            else
                if [[ $ISRUNNING == 1 ]]; then
                    echo ""
                    ejabberdctl $CTLARGS help ${PARAM}
                    echo -n "${COMP_LINE}"
                fi
            fi
            return 0
            ;;
    esac
}

complete -F _ejabberdctl ejabberdctl

# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh
