# bash completion for ssh

_ssh_hosts_from_configs() {
    local -a files=() queue=("$HOME/.ssh/config")
    local f inc pattern resolved

    while ((${#queue[@]})); do
        f="${queue[0]}"
        queue=("${queue[@]:1}")
        [ -r "$f" ] || continue
        files+=("$f")

        while IFS= read -r inc; do
            inc="${inc%$'\r'}"          # CRLF-Rest entfernen, falls vorhanden
            case "$inc" in
                /*) pattern="$inc" ;;
                \~*) pattern="${inc/#\~/$HOME}" ;;
                *) pattern="$HOME/.ssh/$inc" ;;
            esac
            shopt -s nullglob
            for resolved in $pattern; do
                [ -f "$resolved" ] && queue+=("$resolved")
            done
            shopt -u nullglob
        done < <(tr -d '\r' < "$f" | grep -i '^[[:space:]]*Include[[:space:]]' \
                  | awk '{for(i=2;i<=NF;i++) print $i}')
    done

    tr -d '\r' < /dev/null   # no-op, nur zur Konsistenz
    grep -hi '^[[:space:]]*Host[[:space:]]' "${files[@]}" 2>/dev/null \
        | tr -d '\r' \
        | awk '{for(i=2;i<=NF;i++) print $i}' \
        | grep -Ev '[*?!]' \
        | sort -u
}

_ssh_hosts_completion() {
    local cur="${COMP_WORDS[COMP_CWORD]}" prefix=""
    if [[ "$cur" == *@* ]]; then
        prefix="${cur%%@*}@"
        cur="${cur#*@}"
    fi
    COMPREPLY=($(compgen -P "$prefix" -W "$(_ssh_hosts_from_configs)" -- "$cur"))
}

complete -F _ssh_hosts_completion ssh scp sftp
