# bash-completion
#
# container-tools - Manage systemd-nspawn containers
# Copyright (C) 2016 Andreas Kreuzer <andreas.kreuzer@open-infrastructure.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

_container()
{
	local cur prev cmd opts
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD-1]}"

	if [ ${COMP_CWORD} -gt 0 ]
	then
		cmd="${COMP_WORDS[1]}"
	fi

	if [ "${prev}" = "--" ]
	then
		compopt -o bashdefault
		COMPREPLY=( $(compgen -c -- $cur) )
		return 0
	fi

	case "${cmd}" in
		console)
			case "${cur}" in
				-*)
					opts="-n --name"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -s -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		create)
			case "${cur}" in
				-*)
					opts="-n --name -c --capability -d --drop-capability -s --script -b --bind"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(cd /srv/container/container-tools/debconf 2>/dev/null && ls *.cfg 2>/dev/null | sed -e 's/.cfg$//g')
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;

						-s|--script)
							opts=$(cd /usr/share/container-tools/scripts && find -maxdepth 1 -not -type d -and -not -name 'default' -and -not -name 'debconf' -and -not -name '*.d' -printf '%P\n' | sort)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		enter)
			case "${cur}" in
				-*)
					opts="-n --name"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -s -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		limit)
			case "${cur}" in
				-*)
					opts="-n --name --blockio-device-weight --blockio-read-bandwith -b --blockio-weight --blockio-write-bandwith -c --cpu-quota --cpu-shares -m --memory-limit -t --tasks-max"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -a -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		list)
			case "${cur}" in
				-*)
					opts="-a --all -f --format -h --host -o --other -s --started -t --stopped"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-h|--host)
							opts="true false $(hostname -f)"
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;

						-f|--format)
							opts="short full"
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		remove)
			case "${cur}" in
				-*)
					opts="-n --name -f --force"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -t -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		restart)
			case "${cur}" in
				-*)
					opts="-n --name"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -s -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		start)
			case "${cur}" in
				-*)
					opts="-n --name"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -t -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		status)
			case "${cur}" in
				-*)
					opts="-n --name"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -t -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		stop)
			case "${cur}" in
				-*)
					opts="-n --name -f --force"
					COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
					return 0
					;;

				*)
					case "${prev}" in
						-n|--name)
							opts=$(container list -s -f short)
							COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
							return 0
							;;
					esac
					;;
			esac
			;;

		*)
			local commands=$(cd /usr/lib/container-tools/container 2>/dev/null && ls)
			COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) )
			return 0
			;;
	esac

	compopt -o filenames
	COMPREPLY=( $(compgen -f -- $cur) )
	return 0
}

complete -F _container container cnt