#compdef -value-,DBUS_SESSION_BUS_ADDRESS,-default- -value-,DBUS_SYSTEM_BUS_ADDRESS,-default-

local context state state_descr line
typeset -A val_args

_values -S: kind \
	'unix[a unix domain socket]:unix properties:->unix' \
	'tcp[a tcp socket]:tcp properties:->tcp' \
	'unixexec[a process]:unixexec properties:->unixexec' \
	'x-machine-unix[a container]:machine properties:->x-machine-unix'

_sd_bus_get_guid() {
	local TYPE VALUE
	local -a busname=(org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus)

	_call_program -l dbus-guid busctl call $busname GetId |
	while read TYPE VALUE; do
		[[ $TYPE == 's' && -n $VALUE ]] && compadd "$@" - ${(Q)VALUE};
	done
}

local expl ret
case $context in
	unix)
		_values -s, 'unix socket properties' \
			'guid[bus guid]:bus guid:_sd_bus_get_guid -qS,' \
			'(abstract)path[unix domain socket path]:path:_files -r, -g "*(=)"' \
			'(path)abstract[unix domain socket path in the abstract namespace]:abstract path:_files -r, -P@ -g "*(=)"' \
			'uid[unix uid]:uid:_numbers' \
			'gid[unix gid]:gid:_numbers'
		;;
	tcp)
		_values -s, 'unix socket properties' \
			'guid[bus guid]:bus guid:_sd_bus_get_guid -qS,' \
			'host[hostname]:hostname:_hosts -r,'\
			'port[port]:port:_numbers' \
			'family[address family]:address family:(ipv4 ipv6)'
		;;
	unixexec)
		_values -s, 'unixexec properties' \
			'guid[bus guid]:bus guid:_sd_bus_get_guid -qS,' \
			'path[command path]:command path:_absolute_command_paths -r,'\
		;;
	x-machine-unix)
		_values -s, 'machine properties' \
			'guid[bus guid]:bus guid:_sd_bus_get_guid -qS,' \
			'(pid)machine[machine]:machine:_call_function ret _sd_machines' \
			'(machine)pid[pid]:pid:_pids'
		;;
esac
