#
# Copyright (C) 2018 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation; either version 2.1 of the
# licence, or (at your option) any later version.
#
# This is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
# License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this library; if not, see <http://www.gnu.org/licenses/>.
#

# Check for bash
[ -z "$BASH_VERSION" ] && return

####################################################################################################

# Check whether the suggestions have common prefix (i.e. suggestions won't be
# shown and prefix will be completed first)
__has_common_prefix() {
    for (( i = 1; i < ${#COMPREPLY[@]}; i++ )); do
        if [[ "${COMPREPLY[i-1]:${#cur}:1}" != "${COMPREPLY[i]:${#cur}:1}" ]]; then
            return 1 # False
        fi
    done

    return 0 # True
}

# Complete file location
__gio_location() {
    # Prevent breaking on colons, we have to work with uris
    local cur
    _get_comp_words_by_ref -n : cur

    # Resolve dirname for dir listing
    local dir=""
    if [[ $cur =~ "/"$ ]]; then
        dir="$cur"
    elif [[ $cur =~ "/" ]]; then
        # Subtract basename because dirname cmd doesn't work well with schemes
        dir=${cur%$(basename "$cur")}
    fi

    # List volumes and mounts
    local mounts=( )
    while IFS=$'\n' read mount; do
        # Do not care about local mounts
        [[ "$mount" =~ ^"file:" ]] && continue

        # Use only matching mounts
        [[ "$mount" =~ ^"$cur" && "$mount" != "$cur" ]] && mounts+=("$mount")
    done < <(gio mount -li | sed -n -r 's/^ *(default_location|activation_root)=(.*)$/\2/p' | sort -u)

    # Workaround to unescape dir name (e.g. "\ " -> " ")
    declare -a tmp="( ${dir} )"
    unescaped_dir="${tmp[0]}"

    # List files
    local files=()
    local names=()
    while IFS=$'\t' read name size type; do
        # Escape name properly
        local escaped_name="$(printf "%q" "$name")"

        # Append slash for directories and space for files
        if [[ "$type" == "(directory)" ]]; then
            escaped_name="$escaped_name/"
        else
            escaped_name="$escaped_name "
        fi

        path="$dir$escaped_name"

        # Use only matching paths
        if [[ "$path" =~ ^"$cur" ]]; then
            files+=("$path")
            names+=("$escaped_name")
        fi
    done < <(gio list -hl "$unescaped_dir" 2> /dev/null)

    COMPREPLY=("${files[@]}" "${mounts[@]}")

    # Workaround to show suggestions as basenames only
    if ! __has_common_prefix; then
        COMPREPLY=("${mounts[@]} ${names[@]}")

        # Workaround to prevent overwriting suggestions, it adds empty
        # suggestion, otherwise names with colons will be corrupted
        COMPREPLY+=(" ")

        return 0
    fi

    # Workaround to complete names with colons, it removes colon prefix from
    # COMPREPLY
    __ltrim_colon_completions "$cur"
}

__gio() {
    # Complete subcommands
    if (( ${COMP_CWORD} == 1 )); then
        COMPREPLY=($(compgen -W "help version cat copy info list mime mkdir monitor mount move open rename remove save set trash tree" -- "${COMP_WORDS[1]}"))
        compopt +o nospace
        return 0
    fi

    # Complete file locations
    __gio_location
}

####################################################################################################

complete -o nospace -F __gio gio
