#
# 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)
__gio_has_common_prefix() {
    local i
    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=( )
    local mount
    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. "\ " -> " ")
    local -a tmp="( ${dir} )"
    local unescaped_dir="${tmp[0]}"

    # List files
    local files=()
    local names=()
    local name size type
    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

        local 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 ! __gio_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 launch 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
