#
# Bash commandline completion (bash 3.0 and above)
#
_module_avail() {
    module avail -t 2>&1 | sed '
        /^-\+/d; /^\s*$/d;
        /->.*$/d;
        /:$/d;
        /:ERROR:/d;
        s#^\(.*\)/\(.\+\)(.*default.*)#\1\n\1\/\2#;
        s#(.*)$##g;
        s#\s*$##g;
        s#/*$##g;'
}

_module_savelist() {
    module savelist -t 2>&1 | sed '
        /Named collection list$/d;
        /:$/d;
        /:ERROR:/d;'
}

_module_not_yet_loaded() {
    _module_avail | sort | sed -r "\%^(${LOADEDMODULES//:/|})$%d"
}

_module_long_arg_list() {
    local cur="$1" i

    if [[ ${COMP_WORDS[COMP_CWORD-2]} == sw* ]]
    then
        COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") )
        return
    fi
    for ((i = COMP_CWORD - 1; i > 0; i--))
        do case ${COMP_WORDS[$i]} in
        add|load)
            COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") )
            break;;
        rm|remove|unload|switch|swap)
            COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") )
            break;;
        esac
    done
}

# define completion relative to active version
if [ "$MODULES_USE_COMPAT_VERSION" = '1' ]; then
_module() {
   local cur="$2" prev="$3" cmds opts

   COMPREPLY=()

   cmds="add apropos avail clear display help\
      initadd initclear initlist initprepend initrm initswitch\
      keyword list load purge refresh rm show swap switch\
      unload unuse update use whatis"

   opts="-c -f -h -i -l -s -t -u -v -H -V\
      --create --force  --help  --human   --icase\
      --long   --silent --terse --userlvl --verbose --version"

   case "$prev" in
   add|load)   COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") );;
   rm|remove|unload|switch|swap)
      COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") );;
   unuse)      COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );;
   use|*-a*)   ;;       # let readline handle the completion
   -u|--userlvl)  COMPREPLY=( $(compgen -W "novice expert advanced" -- "$cur") );;
   av*|disp*|help|show|whatis)
      COMPREPLY=( $(compgen -W "$(_module_avail)" -- "$cur") );;
   *) if test $COMP_CWORD -gt 2
      then
      _module_long_arg_list "$cur"
      else
      case "$cur" in
      # The mappings below are optional abbreviations for convenience
      ls)   COMPREPLY="list";;   # map ls -> list
      r*)   COMPREPLY="rm";;  # also covers 'remove'
      sw*)  COMPREPLY="switch";;

      -*)   COMPREPLY=( $(compgen -W "$opts" -- "$cur") );;
      *) COMPREPLY=( $(compgen -W "$cmds" -- "$cur") );;
      esac
      fi;;
   esac
}
else
_module() {
    local cur="$2" prev="$3" cmds opts

    COMPREPLY=()

    cmds="add apropos aliases avail append-path display help initadd\
        initclear initlist initprepend initrm is-loaded is-saved is-used\
        is-avail info-loaded keyword list load path paths purge prepend-path\
        refresh reload restore rm remove-path save savelist saveshow saverm\
        search show source swap switch test unload unuse use whatis"

    opts="-D -h -V --debug --help --version"
    list_opts="-l -t --long --terse"
    path_opts="-d --delim --duplicates"
    rm_path_opts="-d --delim --index"
    avail_opts="-d -L -l -t --default --latest --long --terse"

    case "$prev" in
    add|load)       COMPREPLY=( $(compgen -W "$(_module_not_yet_loaded)" -- "$cur") );;
    avail)          COMPREPLY=( $(compgen -W "$avail_opts $(_module_avail)" -- "$cur") );;
    list|savelist)  COMPREPLY=( $(compgen -W "$list_opts" -- "$cur") );;
    restore|save|saveshow|saverm|is-saved)
                    COMPREPLY=( $(compgen -W "$(_module_savelist)" -- "$cur") );;
    rm|remove|unload|switch|swap)
                    COMPREPLY=( $(IFS=: compgen -W "${LOADEDMODULES}" -- "$cur") );;
    unuse|is-used)  COMPREPLY=( $(IFS=: compgen -W "${MODULEPATH}" -- "$cur") );;
    use|-a|--append)   ;;               # let readline handle the completion
    display|help|show|test|whatis|is-loaded|is-avail|info-loaded)
                    COMPREPLY=( $(compgen -W "$(_module_avail)" -- "$cur") );;
    -h|--help|-V|--version|aliases|apropos|keyword|purge|refresh|reload|search|source)
                    ;;
    append-path|prepend-path)
                    COMPREPLY=( $(compgen -W "$path_opts" -- "$cur") );;
    remove-path)
                    COMPREPLY=( $(compgen -W "$rm_path_opts" -- "$cur") );;
    initadd|initclear|initlist|initprepend|initrm)
                    ;;
    *)  if test $COMP_CWORD -gt 2
        then
            _module_long_arg_list "$cur"
        else
            case "$cur" in
            # The mappings below are optional abbreviations for convenience
            ls)     COMPREPLY="list";;      # map ls -> list
            sw*)    COMPREPLY="switch";;

            -*)     COMPREPLY=( $(compgen -W "$opts" -- "$cur") );;
            *)      COMPREPLY=( $(compgen -W "$opts $cmds" -- "$cur") );;
            esac
        fi;;
    esac
}
fi
complete -o default -F _module module
