#
# Completions for the dub command
#

#
# Subcommands
#

# Package creation
complete -c dub -n '__fish_use_subcommand' -x -a init            -d 'Initializes an empty package skeleton'
# Build, test, and run
complete -c dub -n '__fish_use_subcommand' -x -a run             -d 'Builds and runs a package'
complete -c dub -n '__fish_use_subcommand' -x -a build           -d 'Builds a package'
complete -c dub -n '__fish_use_subcommand' -x -a test            -d 'Executes the tests of the selected package'
complete -c dub -n '__fish_use_subcommand' -x -a generate        -d 'Generates project files using the specified generator'
complete -c dub -n '__fish_use_subcommand' -x -a describe        -d 'Prints a JSON description of the project and its dependencies'
complete -c dub -n '__fish_use_subcommand' -x -a clean           -d 'Removes intermediate build files and cached build results'
complete -c dub -n '__fish_use_subcommand' -x -a dustmite        -d 'Create reduced test cases for build errors'
# Package management
complete -c dub -n '__fish_use_subcommand' -x -a fetch           -d 'Manually retrieves and caches a package'
complete -c dub -n '__fish_use_subcommand' -x -a remove          -d 'Removes a cached package'
complete -c dub -n '__fish_use_subcommand' -x -a upgrade         -d 'Forces an upgrade of all dependencies'
complete -c dub -n '__fish_use_subcommand' -x -a add-path        -d 'Adds a default package search path'
complete -c dub -n '__fish_use_subcommand' -x -a remove-path     -d 'Removes a package search path'
complete -c dub -n '__fish_use_subcommand' -x -a add-local       -d 'Adds a local package directory'
complete -c dub -n '__fish_use_subcommand' -x -a remove-local    -d 'Removes a local package directory'
complete -c dub -n '__fish_use_subcommand' -x -a list            -d 'Prints a list of all local packages dub is aware of'
complete -c dub -n '__fish_use_subcommand' -x -a add-override    -d 'Adds a new package override'
complete -c dub -n '__fish_use_subcommand' -x -a remove-override -d 'Removes an existing package override'
complete -c dub -n '__fish_use_subcommand' -x -a list-overrides  -d 'Prints a list of all local package overrides'
complete -c dub -n '__fish_use_subcommand' -x -a clean-caches    -d 'Removes cached metadata'

#
# Subcommand options
#
for cmd in run build
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l rdmd                  -d "Use rdmd"
end
for cmd in run build test
	complete -c dub -n "contains '$cmd' (commandline -poc)" -s f -l force                 -d "Force recompilation"
end

for cmd in run
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l temp-build            -d "Build in temp folder"
end

for cmd in run build test generate describe dustmite
	complete -c dub -n "contains '$cmd' (commandline -poc)" -s c -l config             -r -d "Build configuration"
	complete -c dub -n "contains '$cmd' (commandline -poc)" -s a -l arch               -r -d "Force architecture"
	complete -c dub -n "contains '$cmd' (commandline -poc)" -s d -l debug              -r -d "Debug identifier"
	complete -c dub -n "contains '$cmd' (commandline -poc)" -s d -l d-version          -r -d "Version identifier"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l nodeps                -d "No dependency check"
	complete -c dub -n "contains '$cmd' (commandline -poc)" -s b -l build           -u -x -d "Build type"                        -a "debug plain release release-debug release-nobounds unittest profile profile-gc docs ddox cov cov-ctfe unittest-cov unittest-cov-ctfe syntax"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l build-mode         -x -d "How compiler & linker are invoked" -a "separate allAtOnce singleFile"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l compiler           -x -d "Compiler binary"                   -a "dmd gdc ldc gdmd ldmd"
end

for cmd in run build test generate describe dustmite fetch remove upgrade
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l force-remove       -x -d "Force deletion"
end

for cmd in run build dustmite
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l combined              -d "Build project in single compiler run"
end

for cmd in run build test generate
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l print-builds          -d "Print list of build types"
end

for cmd in run build generate
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l print-configs         -d "Print list of configurations"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l print-platform        -d "Print build platform identifiers"
end

for cmd in build dustmite fetch remove
	complete -c dub -n "contains '$cmd' (commandline -poc)"                            -x -d "Package"                           -a '(dub list | awk \'/^[[:space:]]+/ { print $1 }\' | cut -f 3 -d " ")'
end

for cmd in clean
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l all-packages          -d "Clean all known packages"
end

for cmd in dustmite
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l compiler-status    -x -d "Expected compiler status code"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l compiler-regex     -x -d "Compiler output regular expression"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l linker-status      -x -d "Expected linker status code"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l linker-regex       -x -d "Linker output regular expression"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l program-status     -x -d "Expected program status code"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l program-regex      -x -d "Program output regular expression"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l test-package       -x -d "Perform a test run"
end

for cmd in fetch remove
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l version            -r -d "Version to use"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l system                -d "Deprecated"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l local                 -d "Deprecated"
end

for cmd in upgrade
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l prerelease            -d "Use latest pre-release version"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l verify                -d "Update if successful build"
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l missing-only          -d "Update dependencies without a selected version"
end

for cmd in add-path remove-path add-local remove-local add-override remove-override
	complete -c dub -n "contains '$cmd' (commandline -poc)"      -l system                -d "System-wide"
end



# Common options
complete -c dub -s h -l help        -d "Display help"
complete -c dub      -l root     -r -d "Path to operate in"
complete -c dub      -l registry -r -d "Use DUB registry URL"
complete -c dub      -l annotate    -d "Just print actions"
complete -c dub -s v -l verbose     -d "Print diagnostic output"
complete -c dub      -l vverbose    -d "Print debug output"
complete -c dub -s q -l quiet       -d "Only print warnings and errors"
complete -c dub      -l vquiet      -d "Print no messages"
complete -c dub      -l cache    -x -d "Use cache location" -a "local system user"
