#compdef vzctl

_vzctl() {
	_arguments \
		'--quiet[Quiet]' \
		'--verbose[Verbose output]' \
		'*::OpenVZ command:_OpenVZ_command'
}

(( $+functions[_OpenVZ_command] )) ||
_OpenVZ_command() {
	(($+_OpenVZ_cmds )) || _OpenVZ_cmds=(
		'start:Start a VE' \
		'restart:Restart a VE' \
		'status:Show VE status' \
		'stop:Stop a VE' \
		'enter:Enter into a VE' \
		'mount:Mount VE private area' \
		'umount:Umount VE private area' \
		'set:Set various VE parameters' \
		'destroy:Destroy a zone' \
		'runscript:Run specified shell script into a VE' \
		'create:Create a new VE area' \
		'exec:Execute' \
		'exec2:Execute'
	)

	if (( CURRENT == 1 )); then
		_describe -t commands 'OpenVZ command' _OpenVZ_cmds
	else
        	local curcontext="$curcontext"
                cmd="${_OpenVZ_cmds[(r)$words[1]:*]%%:*}"
                if (( $#cmd )); then
        		curcontext="${curcontext%:*:*}:OpenVZ-${cmd}:"
                        _call_function ret _OpenVZ_$cmd || _message 'no more arguments'
                else
                        _message "Unknow OpenVZ command: $words[1]"
                fi
                return ret
	fi
}

### Utility functions

### OpenVZ functions
(( $+functions[_OpenVZ_set] )) ||
_OpenVZ_set(){
	#runvms=(${${(M)${(f)"$(vzlist -H -a -o veid,status,hostname)"}:#[[:blank:]]##[[:digit:]]*running*}/(#b)[[:blank:]]##([[:digit:]]##)[[:blank:]]##[[:alpha:]]##[[:blank:]]##/$match[1]:})
	runvms=(${${(M)${(f)"$(vzlist -H -a -o veid,status,hostname)"}:#[[:blank:]]##[[:digit:]]**}/(#b)[[:blank:]]##([[:digit:]]##)[[:blank:]]##[[:alpha:]]##[[:blank:]]##/$match[1]:})
	_arguments -s \
		'1:veid:(($runvms))' \
		'--onboot[yes|no]:onboot:(yes no)' \
		'--root' \
		'--userpasswd[user:passwd]' \
		'--save'
}

(( $+functions[_OpenVZ_start] )) ||
_OpenVZ_start(){
	runvms=(${${(M)${(f)"$(vzlist -H -a -o veid,status,hostname)"}:#[[:blank:]]##[[:digit:]]*stopped*}/(#b)[[:blank:]]##([[:digit:]]##)[[:blank:]]##[[:alpha:]]##[[:blank:]]##/$match[1]:})
	_arguments -s \
		'1:veid:(($runvms))'
}

(( $+functions[_OpenVZ_restart] )) ||
_OpenVZ_restart(){
	 runvms=(${${(M)${(f)"$(vzlist -H -a -o veid,status,hostname)"}:#[[:blank:]]##[[:digit:]]*stopped*}/(#b)[[:blank:]]##([[:digit:]]##)[[:blank:]]##[[:alpha:]]##[[:blank:]]##/$match[1]:})
	_arguments -s \
                '1:veid:(($runvms))'
}

(( $+functions[_OpenVZ_stop] )) ||
_OpenVZ_stop(){
	 runvms=(${${(M)${(f)"$(vzlist -H -a -o veid,status,hostname)"}:#[[:blank:]]##[[:digit:]]*running*}/(#b)[[:blank:]]##([[:digit:]]##)[[:blank:]]##[[:alpha:]]##[[:blank:]]##/$match[1]:})
	_arguments -s \
                '1:veid:(($runvms))'
}

(( $+functions[_OpenVZ_reload] )) ||
_OpenVZ_reload(){
	 runvms=(${${(M)${(f)"$(vzlist -H -a -o veid,status,hostname)"}:#[[:blank:]]##[[:digit:]]*running*}/(#b)[[:blank:]]##([[:digit:]]##)[[:blank:]]##[[:alpha:]]##[[:blank:]]##/$match[1]:})
	_arguments -s \
                '1:veid:(($runvms))'
}

(( $+functions[_OpenVZ_exec] )) ||
_OpenVZ_exec(){

}

(( $+functions[_OpenVZ_exec2] )) ||
_OpenVZ_exec2(){

}

(( $+functions[_OpenVZ_enter] )) ||
_OpenVZ_enter(){
         runvms=(${${(M)${(f)"$(vzlist -H -a -o veid,status,hostname)"}:#[[:blank:]]##[[:digit:]]*running*}/(#b)[[:blank:]]##([[:digit:]]##)[[:blank:]]##[[:alpha:]]##[[:blank:]]##/$match[1]:})
        _arguments -s \
                '1:veid:(($runvms))'
}
