# -*- mode: shell-script; sh-basic-offset: 8; indent-tabs-mode: t -*-
# ex: ts=8 sw=8 noet filetype=sh
#
# bash completion for xm

have xm && {
_xen_domain_names()
{
	COMPREPLY=( $(compgen -W "$( xm list 2>/dev/null | awk '!/Name|Domain-0/ { print $1 }'  )" -- $cur) )
}

_xen_domain_ids()
{
	COMPREPLY=( $(compgen -W "$( xm list 2>/dev/null | awk '!/Name|Domain-0/ { print $2 }' )" -- $cur) )
}

_xm()
{
	# TODO: _split_longopt

	local cur prev command options

	COMPREPLY=()
	cur=`_get_cword`

	commands='console create new delete destroy domid domname dump-core \
		list mem-max mem-set migrate pause reboot rename restore \
		resume save shutdown start suspend sysrq trigger top unpause \
		uptime vcpu-list vcpu-pin vcpu-set debug-keys dmesg info log \
		serve sched-credit sched-sedf block-attach block-detach \
		block-list network-attach network-detach network-list \
		vtpm-list vnet-list vnet-create vnet-delete labels addlabel \
		rmlabel getlabel dry-run resources makepolicy loadpolicy \
		cfgbootpolicy dumppolicy help'
	
	if [[ $COMP_CWORD -eq 1 ]] ; then
		COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
	else
		prev=${COMP_WORDS[COMP_CWORD-1]}
		if [[ "$cur" == *=* ]]; then
			prev=${cur/=*/}
			cur=${cur/*=/}
		fi

		command=${COMP_WORDS[1]}
		if [[ "$cur" == -* ]]; then
			# possible options for the command
			case $command in
				create)
					options='-c'
					;;
				dmesg)
					options='--clear'
					;;
				list)
					options='--long'
					;;
				reboot)
					options='-w -a'
					;;
				shutdown)
					options='-w -a -R -H'
					;;
				sched-credit)
					options='-d -w -c'
					;;
				@(block|network|vtpm|vnet)-list)
					options='-l --long'
					;;
				getpolicy)
					options='--dumpxml'
					;;
				new)
					options='-h --help --help_config -q \
						--quiet --path= -f= \
						--defconfig= -F= --config= \
						-b --dryrun -x --xmldryrun \
						-s --skipdtd -p --paused -c \
						--console_autoconnect'
					;;
			esac
			COMPREPLY=( $( compgen -W "$options" -- $cur ) )
		else
			case $command in
				@(console|destroy|domname|domid|list|mem-@(set|max)|pause|reboot|rename|shutdown|unpause|vcpu-@(list|pin|set)|block-list|network-list|vtpm-list))
					_count_args
					case $args in
						2)
							_xen_domain_names
							;;
					esac
					;;
				migrate)
					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
						3)
							_known_hosts_real "$cur"
							;;
					esac
					;;
				@(restore|dry-run|vnet-create))
					_filedir
					;;
				save)
					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
						3)
							_filedir
							;;
					esac
					;;
				sysrq)
					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
						3)
							COMPREPLY=( $(compgen -W "r s e i u b" -- $cur) )
							;;
					esac
					;;
				block-attach)
					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
						3)
							COMPREPLY=( $(compgen -W "phy: file:" -- $cur) )
							;;
						5)
							COMPREPLY=( $(compgen -W "w r" -- $cur) )
							;;
						6)
							_xen_domain_names
							;;
					esac
					;;
				block-detach)
					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
						3)
							COMPREPLY=( $(compgen -W "$( xm block-list $prev 2>/dev/null | awk '!/Vdev/ { print $1 }' )" -- $cur) )
							;;
					esac
					;;
				network-attach)
					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
						*)
							COMPREPLY=( $(compgen -W "script= ip= mac= bridge= backend=" -- $cur) )
							;;
					esac
					;;
				network-detach)
					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
						3)
							COMPREPLY=( $(compgen -W "$( xm network-list $prev 2>/dev/null | awk '!/Idx/ { print $1 }' )" -- $cur) )
							;;
					esac
					;;
				sched-credit)
				        case $prev in
						-d)
							_xen_domain_names
							return 0
							;;
					esac
					;;
				create)
					_filedir
					COMPREPLY=( ${COMPREPLY[@]:-} \
						$( compgen -W '$( command ls \
						/etc/xen 2>/dev/null )' \
						-- $cur ) )
					;;
				new)
					case $prev in
						-@(f|F|-defconfig|-config))
							_filedir
							return 0
							;;
						--path)
							_filedir -d
							return 0
							;;
					esac

					_count_args
				        case $args in
						2)
							_xen_domain_names
							;;
					esac
					;;
			esac
		fi
	fi

	return 0
}
complete -F _xm xm
}
