# shellcheck shell=bash
_GG_MAXDEPTH=5

gg() {
    local _gopath
    _gopath=$(git rev-parse --show-toplevel)
    local paths=($(g "$@"))
    local path_index=0

    if [ ${#paths[@]} -gt 1 ]; then
        local c=1
        for path in "${paths[@]}"; do
            echo "[$c]: cd ${_gopath}/${path}"
            c=$((c + 1))
        done
        echo -n "Go to which path: "
        read -r path_index

        path_index=$((path_index - 1))
    fi

    local path=${paths[$path_index]}
    cd "$_gopath/$path" || {
        echo >&2 "?"
        exit 1
    }
}

#
# Print the directories of the specified Go package name.
#
g() {
    local pkg_candidates
    local _gopath
    _gopath=$(git rev-parse --show-toplevel)
    pkg_candidates="$( (cd "$_gopath" && find . m3/src -mindepth 1 -maxdepth ${_GG_MAXDEPTH} -type d -path "*/$1" -and -not -path '*/vendor/*' -print) | sed 's/^\.\///g' | sort -u)"
    echo "$pkg_candidates" | awk '{print length, $0 }' | sort -n | awk '{print $2}'
}
#
# Bash autocomplete for g and gg functions.
#
_g_complete() {
    COMPREPLY=()
    local cur
    cur="${COMP_WORDS[COMP_CWORD]}"
    local _gopath
    _gopath=$(git rev-parse --show-toplevel)
    COMPREPLY=($(compgen -W "$(for f in $(find "$_gopath" "${_gopath}/m3/src" -mindepth 1 -maxdepth ${_GG_MAXDEPTH} -type d -name "${cur}*" ! -name '.*' ! -path '*/.git/*' ! -path '*/test/*' ! -path '*/vendor/*'); do echo "${f##*/}"; done)" -- "$cur"))
    return 0
}
complete -F _g_complete g
complete -F _g_complete gg