############
# COMMANDS #
############

# 1. In general it's not recommended to run commands one by one, because sbt startup is quite slow
# 2. Only commands without arguments are completed, because any commands with args have to be quoted: `sbt "show key"`
# 3. Only those commands are completed that could be useful to run as one off, like `sbt new ...`, the rest should be run in an interactive sbt shell
# 4. Tasks is somewhat dynamic and depends on the project definition, so only most common are offered
# 5. Same about settings (none are offered)

# These commands can be combined in any order
complete -c sbt -f -a '(string split "\n" "
    about            Display basic information about sbt and the build
    clean            Delete files produced by the build
    compile          Compile sources
    console          Scala REPL: project classes
    consoleQuick     Scala REPL: only project dependencies
    doc              Generate API documentation
    help             Display help message
    package          Produce the main artifact
    plugins          List currently available plugins
    projects         List the names of available projects
    publish          Publish artifacts to a repository
    publishLocal     Publish artifacts to the local Ivy repository
    publishM2        Publish artifacts to the local Maven repository
    run              Run a main class
    settings         List the settings defined for the current project
    shell            Launch an interactive sbt prompt
    tasks            List the tasks defined for the current project
    test             Execute all tests
" | string trim | string replace -r "\s+" "\t")' \
    -n 'not contains -- "new" (commandline -cpx);
    and not contains -- "client" (commandline -cpx)'

# These cannot be combined with any other commands and require an argument
complete -c sbt -f -n 'test  (count (commandline -cpx)) = 1 ' -a new -d 'Create a new sbt project from the given template'
complete -c sbt -f -n 'test  (count (commandline -cpx)) = 1 ' -a client -d 'Connect to a server with an interactive sbt prompt'

###########
# OPTIONS #
###########

# This is based on the output of `sbt -help`:

# general options without arguments
complete -c sbt -o help -s h -f -d "Print options help message"
complete -c sbt -o verbose -s v -f -d "Print more details"
complete -c sbt -o debug -s d -f -d "Set log level to debug"
complete -c sbt -o no-colors -f -d "Disable ANSI color codes"
complete -c sbt -o sbt-create -f -d "Launch even if there's no sbt project"
complete -c sbt -o no-share -f -d "Use all local caches"
complete -c sbt -o no-global -f -d "Use global caches, but not global ~/.sbt directory"
complete -c sbt -o batch -f -d "Disable interactive mode"

# general options with arguments
complete -c sbt -o sbt-dir -d "Specify path to global settings/plugins" -r # path
complete -c sbt -o sbt-boot -d "Specify path to shared boot directory" -r # path
complete -c sbt -o ivy -d "Specify path to local Ivy repository" -r # path
complete -c sbt -o mem -d "Set memory options" -x # integer? (default: -Xms1024m -Xmx1024m -XX:ReservedCodeCacheSize=128m -XX:MaxPermSize=256m)
complete -c sbt -o port -d "Turn on JVM debugging, open at the given port" -r # port

# sbt version
complete -c sbt -o sbt-version -d "Use specified version of sbt" -x -a '0.13.(seq 0 6)\t"" 1.0.0\t""'
complete -c sbt -o sbt-jar -d "Use specified jar as the sbt launcher" -r # jar path
complete -c sbt -o sbt-rc -d "Use an RC version of sbt" -f
complete -c sbt -o sbt-snapshot -d "Use a snapshot version of sbt" -f

# java-related
complete -c sbt -o java-home -d "Alternate JAVA_HOME" -r # path
complete -c sbt -o D -d "Pass -D option directly to the Java runtime" -x # -Dkey=val
complete -c sbt -o J-X -d "Pass -X option directly to the Java runtime" -x # -X*
complete -c sbt -o S-X -d "Pass -X option to sbt's scalacOptions" -x # -X*
# TODO: list available -X options if it's possible to do in an automatic way