# bash completion for feh(1)                               -*- shell-script -*-

_feh()
{
    local cur prev words cword split
    _init_completion -s || return

    case "$prev" in
        --image-bg | -B)
            COMPREPLY=($(compgen -W 'checks white black' -- "$cur"))
            return
            ;;
        --filelist | --output | --output-only | --start-at | -!(-*)[foO\|])
            _filedir
            return
            ;;
        --caption-path | --fontpath | --output-dir | -!(-*)[KCj])
            _filedir -d
            return
            ;;
        --font | --menu-font | --title-font | -!(-*)[eM@])
            # expect string like "dejavu.ttf/12"
            if [[ $cur == */* ]]; then # expect integer value
                COMPREPLY=($(compgen -P "$cur" -W '{0..9}'))
                compopt -o nospace
                return
            fi
            local font_path
            # font_path="$(imlib2-config --prefix 2>/dev/null)/share/imlib2/data/fonts"
            # COMPREPLY=( $(cd "$font_path" 2>/dev/null; compgen -f \
            #     -X "!*.@([tT][tT][fF])" -S / -- "$cur") )
            for ((i = ${#words[@]} - 1; i > 0; i--)); do
                if [[ ${words[i]} == -@(C|-fontpath) ]]; then
                    font_path="${words[i + 1]}"
                    COMPREPLY+=($(
                        cd "$font_path" 2>/dev/null
                        compgen -f \
                            -X "!*.@([tT][tT][fF])" -S / -- "$cur"
                    ))
                fi
            done
            compopt -o nospace
            return
            ;;
        --theme | -!(-*)T)
            local conf_path=~/.config/feh/themes
            local theme_name theme_opts
            [[ -r $conf_path ]] || return
            while read theme_name theme_opts; do
                if [[ $theme_name == '#'* || $theme_name == "" ]]; then
                    continue
                fi
                COMPREPLY+=($(compgen -W "$theme_name" -- "$cur"))
            done <"$conf_path"
            return
            ;;
        --sort | -!(-*)S)
            COMPREPLY=($(compgen -W 'name filename mtime width height
                pixels size format' -- "$cur"))
            return
            ;;
        --reload | --limit-height | --limit-width | --thumb-height | --thumb-width | \
            --thumb-redraw | --magick-timeout | -!(-*)[RHWEyJ])
            # expect integer value
            COMPREPLY+=($(compgen -W '{0..9}'))
            compopt -o nospace
            return
            ;;
        --zoom)
            # expect integer value or "max", "fill"
            COMPREPLY=($(compgen -W 'max fill' -- "$cur"))
            if [[ ! $cur || ! ${COMPREPLY-} ]]; then
                COMPREPLY+=($(compgen -W '{0..9}'))
                compopt -o nospace
            fi
            return
            ;;
        --alpha | -!(-*)a)
            COMPREPLY=($(compgen -W '{0..255}' -- "$cur"))
            return
            ;;
        --bg | -!(-*)b)
            _filedir
            COMPREPLY+=($(compgen -W 'trans' -- "$cur"))
            return
            ;;
        --geometry | --max-dimension | --min-dimension | -!(-*)g)
            # expect string like 640x480
            if [[ $cur && $cur != *x* ]]; then
                COMPREPLY=(x)
            fi
            COMPREPLY+=($(compgen -W "{0..9}"))
            compopt -o nospace
            return
            ;;
        --customlist | --index-info | --info | --slideshow-delay | --thumb-title | \
            --title | -!(-*)[LD~^])
            # argument required but no completions available
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        # Some versions of feh just output "See 'man feh'" for --help :(
        COMPREPLY=($(compgen -W '$(_parse_help "$1" --help)' -- "$cur"))
        if [[ ${COMPREPLY-} ]]; then
            [[ $COMPREPLY == *= ]] && compopt -o nospace
            return
        fi
    fi

    # FIXME: It is hard to determine correct supported extensions.
    # feh can handle any format that imagemagick can plus some others
    _filedir 'xpm|tif?(f)|png|p[npgba]m|iff|?(i)lbm|jp?(e)g|jfi?(f)|gif|bmp|arg?(b)|tga|xcf|ani|ico|?(e)ps|pdf|dvi|txt|svg?(z)|cdr|[ot]tf'
} &&
    complete -F _feh feh

# ex: filetype=sh
