#compdef archbuild arch-nspawn archrelease commitpkg pkgctl diffpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-x86_64-build=archbuild testing-x86_64-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild multilib-staging-build=archbuild kde-unstable-x86_64-build=archbuild gnome-unstable-x86_64-build=archbuild checkpkg sogrep offload-build makerepropkg
#
# SPDX-License-Identifier: GPL-3.0-or-later

_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/valid-tags.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh

_binary_arch=${_arch[*]:0:-1}
_colors=(never always auto)

_archbuild_args=(
	'-c[Recreate the chroot before building]'
	'-r[Create chroots in this directory]:base_dir:_files -/'
	'-h[Display usage]'
	'--[Introduce makechrootpkg options]:*::makechrootpkg options:=  _dispatch makechrootpkg makechrootpkg'
)

_pkgctl_repo_cmds=(
	"pkgctl repo command"
	"clone[Clone a package repository]"
	"configure[Configure a clone according to distro specs]"
	"web[Open the packaging repository's website]"
)

_pkgctl_repo_clone_args=(
	'(-m --maintainer=)'{-m,--maintainer=}'[Clone all packages of the named maintainer]:maintainer:'
	'(-u --unprivileged)'{-u,--unprivileged}'[Read-only access without packager info as Git author]'
	'--universe[Clone all existing packages, useful for cache warming]'
	'(-h --help)'{-h,--help}'[Display usage]'
	'*:packages:_devtools_completions_all_packages'
)

_pkgctl_repo_configure_args=(
	'(-u --unprivileged)'{-u,--unprivileged}'[Configure read-only repo without packager info as Git author]'
	'(-h --help)'{-h,--help}'[Display usage]'
	'*:git_dir:_files -/'
)

_pkgctl_repo_web_args=(
	'(-h --help)'{-h,--help}'[Display usage]'
	'*:git_dir:_files -/'
)

_arch_nspawn_args=(
	'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
	'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
	'-c[Set pacman cache]:pacman_cache:_files -/'
	'-f[Copy file from the host to the chroot]:copy_file:_files'
	'-s[Do not run setarch]'
	'-h[Display usage]'
	'1:chroot_dir:_files -/'
)

_archrelease_args=(
	'-f[Force release without checks]'
	"*:arch:($_tags[*])"
)

_commitpkg_args=(
	'-f[Force release without checks]'
	'-s[Target repo server]'
	'-l[Set bandwidth limit]:limit'
	"-a[Release to a specific architecture only]:arch:($_arch[*])"
	'1:commit_msg'
)

_diffpkg_args=(
	'(-l --list)'{-l,--list}'[Tar content list diff mode]'
	'(-d --diffoscope)'{-d,--diffoscope}'[Diffoscope diff mode]'
	'(-p --pkginfo)'{-p,--pkginfo}'[.PKGINFO diff mode]'
	'(-b --buildinfo)'{-b,--buildinfo}'[.BUILDINFO diff mode]'
	'(-m --makepkg-config)'{-m,--makepkg-config}'[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
	'(-u -U --unified)'{-u,-U,--unified}'[Output 3 lines of unified context]'
	'(-y --side-by-side)'{-y,--side-by-side}'[Output in two columns]'
	'--color=[Color output]:when:($_colors[*])'
	'(-W --width=)'{-W,--width=}'[Output at most NUM print columns]:num:(auto columns)'
	'(-P --pool=)'{-P,--pool=}'[pool directory]:dir:_files -/'
	'(-v --verbose)'{-v,--verbose}'[Provide more detailed/unfiltered output]'
	'(-h --help)'{-h,--help}'[Display usage]'
	'*:packages:_devtools_completions_all_packages'
)

_finddeps_args=(
	'1:packages:_devtools_completions_all_packages'
)

_makechrootpkg_args=(
	'-h[Display usage]'
	'-c[Clean the chroot before building]'
	'-d[Bind directory into build chroot as read-write]:bind_dir_rw:_files -/'
	'-D[Bind directory into build chroot as read-only]:bind_dir_ro:_files -/'
	'-u[Update the working copy of the chroot before building]'
	'-r[The chroot dir to use]:chroot_dir:_files -/'
	'-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
	'-l[The directory to use as the working copy]:copy_dir:_files -/'
	'-n[Run namcap on the package]'
	'-T[Build in a temporary directory]'
	'-U[Run makepkg as a specified user]:makepkg_user'
)

_mkarchroot_args=(
	'-U[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"'
	'-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"'
	'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
	'-c[Set pacman cache]:pacman_cache:_files -/'
	'-h[Display usage]'
	'1:working_dir:_files -/'
	'*:packages:_devtools_completions_all_packages'
)

_rebuildpkgs_args=(
	'1:chroot_dir:_files -/'
	'*:packages:_devtools_completions_all_packages'
)

_checkpkg_args=(
	'(-r --rmdir)'{-r,--rmdir}'[Remove the temporary directory]'
	'(-w --warn)'{-w,--warn}'[Print a warning in case of differences]'
	'(-M --makepkg-config)'{-M,--makepkg-config}'[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
	'(-h --help)'{-h,--help}'[Display usage]'
)

_sogrep_args=(
	'(-v --verbose)'{-v,--verbose}'[Show matched links in addition to pkgname]'
	'(-r --refresh)'{-r,--refresh}'[Refresh the links databases]'
	'(-h --help)'{-h,--help}'[Display usage]'
	'1:repo:(all $_repos[*])'
	'2:libname'
)

_offload_build_args=(
	'(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($_build_repos[*])'
	'(-a --arch)'{-a,--arch}'[Build against a specific architecture]:arch:(${_binary_arch[*]})'
	'(-s --server)'{-s,--server}'[Offload to a specific Build server]:server:'
	'(-h --help)'{-h,--help}'[Display usage]'
)

_makerepropkg_args=(
	'-d[Run diffoscope if the package is unreproducible]'
	'-c[Set pacman cache]:pacman_cache:_files -/'
	'-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"'
	'-h[Display usage]'
	'*:working_dir:_files -g "*.pkg.tar.*(.)"'
)

_devtools_completions_all_packages() {
	typeset -U packages
	packages=($(_call_program packages pacman -Sql))
	compadd - "${(@)packages}"
}

_pkgctl_cmds=(
	"pkgctl command"
	"diff[Compare package files using different modes]"
	"repo[Manage Git packaging repositories and their configuration]"
)

_pkgctl_diff_args=("${_diffpkg_args[@]}")

_handle_subcommands() {
	local service_name=${1}
	if typeset -p ${service_name}_cmds &> /dev/null; then
		_arguments -C \
			"1: :->cmds" \
			'*::arg:->args'
		case $state in
			cmds)
				local service_cmds=${service_name}_cmds[@]
				_values "${(P)service_cmds}"
				;;
			args)
				local service_sub=${service_name}_$line[1]
				if typeset -p ${service_sub}_args &> /dev/null; then
					local cmd_args=${service_sub}_args[@]
					_arguments -s "${(P)cmd_args}"
				elif typeset -p ${service_sub}_cmds &> /dev/null; then
					_handle_subcommands "${service_sub}"
				fi
				;;
		esac
	elif typeset -p ${service_name}_args &> /dev/null; then
		local argname="${service_name}_args[@]"
		_arguments -s "${(P)argname}"
	fi
}

_devtools() {
	_handle_subcommands _${service//-/_}
}

_devtools