#!/bin/bash
#
# bash-completion - part of the FDroid server tools
# Bash completion for the fdroid main tools
#
# Copyright (C) 2013, 2014 Daniel Martí <mvdan@mvdan.cc>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# 'fdroid' is completed automatically, but aliases to it are not.
# For instance, to alias 'fd' to 'fdroid' and have competion available:
#
#	alias fd='fdroid'
#	complete -F _fdroid fd
#
# One can use completion on aliased subcommands as follows:
#
#	alias fbuild='fdroid build'
#	complete -F _fdroid_build fbuild

__fdroid_init() {
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD-1]}"

	(( $# >= 1 )) && __complete_${1}
}

__by_ext() {
	local ext="$1"
	files=( metadata/*.$ext )
	files=( ${files[@]#metadata/} )
	files=${files[@]%.$ext}
	echo "$files"
}

__package() {
	files="$(__by_ext txt) $(__by_ext yaml) $(__by_ext json) $(__by_ext xml)"
	COMPREPLY=( $( compgen -W "$files" -- $cur ) )
}

__apk_package() {
	files=( ${1}/*.apk )
	[ -f "${files[0]}" ] || return

	files=( ${files[@]#*/} )
	files=${files[@]%_*}
	COMPREPLY=( $( compgen -W "$files" -- $cur ) )
}

__apk_vercode() {
	local p=${cur:0:-1}

	files=( ${1}/${p}_*.apk )
	[ -f "${files[0]}" ] || return

	files=( ${files[@]#*_} )
	files=${files[@]%.apk}
	COMPREPLY=( $( compgen -P "${p}:" -W "$files" -- $cur ) )
}

__vercode() {
	local p v
	echo $cur | IFS=':' read p v

	COMPREPLY=( $( compgen -P "${p}:" -W "$( while read line; do
		if [[ "$line" == "Build Version:"* ]]
		then
			line="${line#*,}"
			printf "${line%%,*} "
		elif [[ "$line" == "Build:"* ]]
		then
			line="${line#*,}"
			printf "${line%%,*} "
		fi
		done < "metadata/${p}.txt" )" -- $cur ) )
}

__complete_options() {
	case "${cur}" in
		--*)
			COMPREPLY=( $( compgen -W "--help --version ${lopts}" -- $cur ) )
			return 0;;
		*)
			COMPREPLY=( $( compgen -W "-h ${opts} --help --version ${lopts}" -- $cur ) )
			return 0;;
	esac
}

__complete_build() {
	opts="-v -q -l -s -t -f -a -w"

	lopts="--verbose --quiet --latest --stop --test --server --resetserver
 --on-server --skip-scan --no-tarball --force --all --wiki --no-refresh"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*:*)
			__vercode
			return 0;;
		*)
			__package
			return 0;;
	esac
}

__complete_install() {
	opts="-v -q"
	lopts="--verbose --quiet --all"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*:)
			__apk_vercode repo
			return 0;;
		*)
			__apk_package repo
			return 0;;
	esac
}

__complete_update() {
	opts="-c -v -q -b -i -I -e -w"
	lopts="--create-metadata --verbose --quiet --buildreport
 --interactive --icons --editor --wiki --pretty --clean --delete-unknown
 --nosign"
	case "${prev}" in
		-e|--editor)
			_filedir
			return 0;;
	esac
	__complete_options
}

__complete_publish() {
	opts="-v -q"
	lopts="--verbose --quiet"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*:)
			__apk_vercode unsigned
			return 0;;
		*)
			__apk_package unsigned
			return 0;;
	esac
}

__complete_checkupdates() {
	opts="-v -q"
	lopts="--verbose --quiet --auto --autoonly --commit --gplay"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*)
			__package
			return 0;;
	esac
}

__complete_import() {
	opts="-u -s -q"
	lopts="--url --subdir --rev --quiet"
	case "${prev}" in
		-u|--url|-s|--subdir|--rev) return 0;;
	esac
	__complete_options
}

__complete_readmeta() {
	opts="-v -q"
	lopts="--verbose --quiet"
	__complete_options
}

__complete_rewritemeta() {
	opts="-v -q -l"
	lopts="--verbose --quiet --list"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*)
			__package
			return 0;;
	esac
}

__complete_lint() {
	opts="-v -q"
	lopts="--verbose --quiet"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*)
			__package
			return 0;;
	esac
}

__complete_scanner() {
	opts="-v -q"
	lopts="--verbose --quiet"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*:)
			__vercode
			return 0;;
		*)
			__package
			return 0;;
	esac
}

__complete_verify() {
	opts="-v -q -p"
	lopts="--verbose --quiet"
	case "${cur}" in
		-*)
			__complete_options
			return 0;;
		*:)
			__vercode
			return 0;;
		*)
			__package
			return 0;;
	esac
}

__complete_stats() {
	opts="-v -q -d"
	lopts="--verbose --quiet --download"
	__complete_options
}

__complete_server() {
	opts="-i -v -q"
	lopts="--identity-file --local-copy-dir --sync-from-local-copy-dir
 --verbose --quiet --no-checksum update"
	__complete_options
}

__complete_signindex() {
	opts="-v -q"
	lopts="--verbose"
	__complete_options
}

__complete_init() {
	opts="-v -q -d"
	lopts="--verbose --quiet --distinguished-name --keystore
 --repo-keyalias --android-home --no-prompt"
	__complete_options
}

__cmds=" build init install update publish checkupdates import readmeta \
rewritemeta lint scanner verify stats server signindex "

for c in $__cmds; do
	eval "_fdroid_${c} () {
		local cur prev opts lopts
		__fdroid_init ${c}
	}"
done

_fdroid() {
	local cmd
	cmd=${COMP_WORDS[1]}

	[[ $__cmds == *\ $cmd\ * ]] && _fdroid_${cmd} || {
		(($COMP_CWORD == 1)) && COMPREPLY=( $( compgen -W "${__cmds}" -- $cmd ) )
	}
}

_fd-commit() {
	__package
}

complete -F _fdroid fdroid
complete -F _fd-commit fd-commit

return 0
