#!/bin/bash
#
# fdroid completion support.
#
# 'fdroid' is aliased 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
#
# There are also completion function for '-p com.some.app' aliases:
#
#	alias fbld='fdroid build -v -l -p'
#	complete -F _fdroid_build_project fbld
#
#	alias fcheckup='fdroid checkupdates -v -p'
#	complete -F _fdroid_checkupdates_project fcheckup
#
# This way, one can simply do 'fbld com.some.app' or 'fcheckup com.some.app'

__package() {
	[[ -d ./metadata ]] || return 0
	files=( metadata/*.txt )
	files=( ${files[@]#metadata/} )
	files=${files[@]%.txt}
	COMPREPLY=( $( compgen -W "$files" -- $cur ) )
}

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

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

__vercode() {
	local s p_found p
	s=${#COMP_WORDS[*]}
	p_found=false

	$aliased && p=${COMP_WORDS[1]} || {
		for (( i=1; i <= s; i++ )); do
			$p_found && { p=${COMP_WORDS[$i]}; break;}
			[[ ${COMP_WORDS[$i]} == -p ]] || [[ ${COMP_WORDS[$i]} == --package ]] &&\
				p_found=true
		done
		$p_found || return 0
	}

	COMPREPLY=( $( compgen -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 "${lopts}" -- $cur ) )
			return 0;;
		*)
			COMPREPLY=( $( compgen -W "${opts} ${lopts}" -- $cur ) )
			return 0;;
	esac
}

__complete_build() {
	opts="-h -v -p -c -l -s -t -f"
	lopts="--help --verbose --package --vercode --latest --server --resetserver
 --on-server --force --install --all"
	case "${prev}" in
		-p|--package)
			__package
			return 0;;
		-c|--vercode)
			__vercode
			return 0;;
	esac
	__complete_options
}

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

__complete_publish() {
	opts="-h -v -p"
	lopts="--help --verbose --package"
	case "${prev}" in
		-p|--package)
			__package
			return 0;;
	esac
	__complete_options
}

__complete_checkupdates() {
	opts="-h -v -p"
	lopts="--help --verbose --package --auto --autoonly --commit --gplay"
	case "${prev}" in
		-p|--package)
			__package
			return 0;;
	esac
	__complete_options
}

__complete_import() {
	opts="-h -u -s -r"
	lopts="--help --url --subdir --repo"
	case "${prev}" in
		-u|--url|-r|--repo) return 0;;
		-s|--subdir)
			_filedir
			return 0;;
	esac
	__complete_options
}

__complete_rewritemeta() {
	opts="-h -v -p"
	lopts="--help --verbose --package"
	case "${prev}" in
		-p|--package)
			__package
			return 0;;
	esac
	__complete_options
}

__complete_scanner() {
	opts="-h -v -p"
	lopts="--help --verbose --package --nosvn"
	case "${prev}" in
		-p|--package)
			__package
			return 0;;
	esac
	__complete_options
}

__complete_verify() {
	opts="-h -v -p"
	lopts="--help --verbose --package"
	case "${prev}" in
		-p|--package)
			__package
			return 0;;
	esac
	__complete_options
}

__complete_stats() {
	opts="-h -v -d"
	lopts="--help --verbose --download"
	__complete_options
}

__complete_server() {
	opts="-h -v"
	lopts="--help --verbose update"
	__complete_options
}

__complete_init() {
	opts="-h -v -d"
	lopts="--help --verbose --keystore --distinguished-name --repo-keyalias"
	__complete_options
}

_fdroid() {
	local cmd cmds aliased
	cmd=${COMP_WORDS[1]}
	cmds=" build init update publish checkupdates import rewritemeta scanner verify stats server "
	aliased=false

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

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

_fdroid_build_project() {
	local cur prev cmds opts lopts aliased
	__fdroid_init
	aliased=true
	(( $COMP_CWORD == 1 )) && prev="-p"

	__complete_build
}

_fdroid_checkupdates_project() {
	local cur prev cmds opts lopts aliased
	__fdroid_init
	aliased=true
	(( $COMP_CWORD == 1 )) && prev="-p"

	__complete_checkupdates
}

_fd-commit() {
	__package
}

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

return 0
