#compdef xbulk xbump xchangelog xcheckrestart xdbg xdeptree xdiff xdowngrade xgenfstab xgensum xgrep xi xilog xlg xlocate xlog xls xmypkgs xoptdiff xpkg xpkgdiff xq-xtools xrevbump xrevshlib xsrc xsubpkg xtree

_xbps  # force autoload

_xtools_archs=( {aarch64,armv{6,7}l,i686,x86_64}{,-musl} )

_xtools_all_packages() {
	compadd "$@" -- $(xdistdir)/srcpkgs/*(:t)
}

_xtools_one_arch() {
	_arguments : \
		":architecture:($_xtools_archs)"
}

_xtools_one_template() {
	_arguments : \
		':available templates:_xtools_all_packages'
}

_xtools_just_packages() {
	_arguments : \
		'*:package:_xbps_all_packages'
}

_xtools_contributors() {
	compadd "$@" -- $(git -C "$(xdistdir)" log --pretty=%ce)
}

_xbulk() {
	_arguments : \
		'-n[dry-run]' \
		'-k[keep going when a build fails]' \
		'*:available templates:_xtools_all_packages'
}

_xcheckrestart() {
	_arguments : \
		'-v[verbose]'
}

_xdiff() {
	_arguments : \
		'-u[only display differences]' \
		'-l[only list files with differences]' \
		':directory:_files -/'
}

_xdowngrade() {
	_arguments : \
		'*:package files:_files -g \*.xbps'
}

_xgenfstab() {
	_arguments -s : \
		'(-P)-p[Exclude pseudo-filesystems]' \
		'(-p)-P[Include pseudo-filesystems]' \
		'(-L -U)-t[Use TAG for identifiers]:TAG:(LABEL UUID PARTLABEL PARTUUID)' \
		'(-t -U)-L[Use labels for identifiers]' \
		'(-t -L)-U[Use UUIDs for identifiers]' \
		'1:directory:_files -/'
}

_xgensum() {
	_arguments -s : \
		'-f[force downloading of files]' \
		'-c[use content checksum]' \
		'-i[substitute in-place]' \
		'-H[Absolute path to hostdir]:hostdir:_files -/' \
		':available templates:_xtools_all_packages'
}

_xgrep() {
	_arguments : \
		'1:pattern: ' \
		'*:package:_xbps_installed_packages'
}

_xilog() {
	_arguments : \
		'1::pattern: '
}

_xlocate() {
	_arguments : \
		'-S[sync with official xlocate.git]' \
		'-g[update xlocate.git]' \
		'1::pattern: '
}

_xmypkgs() {
	_arguments : \
		'1::contributor:_xtools_contributors'
}

_xoptdiff() {
	_arguments : \
		'-q[only list differing packages]' \
		'*:package:_xbps_installed_packages'
}

_xpkg() {
	_arguments : \
		'-R[consider only packages from repository]:repository:_files -/' \
		'-a[list all packages]' \
		'-m[list manual packages]' \
		'-O[list orphaned packages]' \
		'-H[list packages on hold]' \
		'-v[show version numbers]' \
		'-V[show version numbers and description]'
}

_xpkgdiff() {
	_arguments : \
		'-S[compare package metadata]' \
		'-c[compare a file from package]:file name:_files:package:_xbps_all_packages' \
		'-f[compare package file lists]' \
		'-p[compare package properties]:property:($_xbps_properties)' \
		'-r[reverse diff (compare local to remote)]' \
		'-x[compare package dependencies]' \
		'-t[compare the full package dependency tree for -x]' \
		'-a[architecture]:architecture:('"$_xtools_archs"')' \
		'*:package:_xtools_just_packages'
}

_xq-xtools() {
	_arguments : \
		'-R[include remote information too]' \
		'*:package:_xbps_all_packages'
}

_xrevbump() {
	_arguments : \
		'1:message: ' \
		'*:available templates:_xtools_all_packages'
}

_xsubpkg() {
	_arguments : \
		'-m[list master package]'\
		'*:package:_xbps_all_packages'
}

_xtools() {
	case "$service" in
		xbulk) _xbulk "$@";;
		xbump) _xtools_one_template "$@";;
		xchangelog) _xtools_one_template "$@";;
		xcheckrestart) _xcheckrestart "$@";;
		xdbg) _xtools_just_packages "$@";;
		xdeptree) _xtools_just_packages "$@";;
		xdiff) _xdiff "$@";;
		xdowngrade) _xdowngrade "$@";;
		xgenfstab) _xgenfstab "$@";;
		xgensum) _xgensum "$@";;
		xgrep) _xgrep "$@";;
		xi) _xbps_install "$@";;
		xilog) _xilog"$@";;
		xlg) _xtools_one_template "$@";;
		xlocate) _xlocate "$@";;
		xlog) _xtools_one_template "$@";;
		xls) _xtools_just_packages "$@";;
		xmypkgs) _xmypkgs "$@";;
		xoptdiff) _xoptdiff "$@";;
		xpkg) _xpkg "$@";;
		xpkgdiff) _xpkgdiff "$@";;
		xq-xtools) _xq-xtools "$@";;
		xrevbump) _xrevbump "$@";;
		xrevshlib) _xtools_one_template "$@";;
		xsrc) _xtools_one_template "$@";;
		xsubpkg) _xsubpkg "$@";;
		xtree) _xtools_just_packages "$@";;
	esac
}

_xtools "$@"
