#compdef west

# Copyright (c) 2022 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

# Ensure this works also when being source-ed
compdef _west west

typeset -A -g _opt_args

_west_cmds() {
  local -a builtin_cmds=(
  'init[create a west workspace]'
  'update[update projects described in west manifest]'
  'list[print information about projects]'
  'manifest[manage the west manifest]'
  'diff["git diff" for one or more projects]'
  'status["git status" for one or more projects]'
  'forall[run a command in one or more local projects]'
  'config[get or set config file values]'
  'topdir[print the top level directory of the workspace]'
  'help[get help for west or a command]'
  )

  local -a zephyr_ext_cmds=(
  'completion[display shell completion scripts]'
  'boards[display information about supported boards]'
  'build[compile a Zephyr application]'
  'sign[sign a Zephyr binary for bootloader chain-loading]'
  'flash[flash and run a binary on a board]'
  'debug[flash and interactively debug a Zephyr application]'
  'debugserver[connect to board and launch a debug server]'
  'attach[interactively debug a board]'
  'zephyr-export[export Zephyr installation as a CMake config package]'
  'spdx[create SPDX bill of materials]'
  'blobs[work with binary blobs]'
  )

  local -a all_cmds=(${builtin_cmds} ${zephyr_ext_cmds})

  if [[ -v WEST_COMP_CHECK_WORKSPACE ]]; then
    west topdir &>/dev/null
    if [ $? -eq 0 ]; then
      _values "west command" $all_cmds
    else
      _values "west command" $builtin_cmds
    fi
  else
      _values "west command" $all_cmds
  fi
}

# Completion script for Zephyr's meta-tool, west
_west() {


  # Global options for all commands
  local -a global_opts=(
  # (: * -) as exclusion list means exclude everything else
  '(: * -)'{-h,--help}'[show help]'
  # An exclusion list with the very option means only allow once
  {-v,--verbose}'[enable verbosity]'
  '(: * -)'{-V,--version}'[print version]'
  '(-z --zephyr-base)'{-z,--zephyr-base}'[zephyr base folder]:zephyr base folder:_directories'
  )

  typeset -A opt_args
  local curcontext="$curcontext" context state state_descr line
  local -a orig_words

  orig_words=( ${words[@]} )

  _arguments -S -C \
    $global_opts \
          "1: :->cmds" \
          "*::arg:->args" \

  case "$state" in
  cmds)
    _west_cmds
    ;;

  args)
    _opt_args=( ${(@kv)opt_args} )
    _call_function ret _west_$line[1]
    ;;
  esac
}

__west_x()
{
  west 2>/dev/null "$@"
}

_get_west_projs() {
  local extra_args
  [[ -v _opt_args[-z] ]] && extra_args="-z $_opt_args[-z]"
  [[ -v _opt_args[--zephyr-base] ]] && extra_args="-z $_opt_args[--zephyr-base]"

  _west_projs=($(__west_x $extra_args list --format={name}))
  _describe 'projs' _west_projs
}

_get_west_boards() {
  _west_boards=($(__west_x boards --format={name}))
  _describe 'boards' _west_boards
}

_west_init() {
  local -a opts=(
  '(-l --local)'{--mr,--manifest-rev}'[manifest revision]:manifest rev:'
  {--mf,--manifest-file}'[manifest file]:manifest file:'
  '(-l --local)'{-m,--manifest}'[manifest URL]:manifest URL:_directories'
  '(-m --manifest --mr --manifest-rev)'{-l,--local}'[use local directory as manifest repository]:local manifest repository directory:_directories'
  )

  _arguments -S $opts \
          "1:workspace directory:"
}

_west_update() {
  local -a opts=(
  '--stats[print performance stats]'
  '--name-cache[name-based cache]:name cache folder:_directories'
  '--path-cache[path-based cache]:path cache folder:_directories'
  {-f,--fetch}'[fetch strategy]:fetch strategy:(always smart)'
  {-o,--fetch-opt}'[fetch options]:fetch options:'
  {-n,--narrow}'[narrow fetch]'
  {-k,--keep-descendants}'[keep manifest-rev descendants checked out]'
  {-r,--rebase}'[rebase checked out branch onto the new manifest-rev]'
  )

  _arguments -S $opts \
      "1:west proj:_get_west_projs"
}

_west_list() {
  local -a opts=(
  {-a,--all}'[include inactive projects]'
  '--manifest-path-from-yaml[print performance stats]'
  {-f,--format}'[format string]:format string:'
  )

  _arguments -S $opts \
      "1:west proj:_get_west_projs"
}

_west_manifest() {
  local -a opts=(
  '--resolve[resolve into single manifest]'
  '--freeze[resolve into single manifest, with SHAs]'
  '--validate[silently validate manifest]'
  '--path[print the path to the top level manifest file]'
  {-o,--out}'[output file]:output file:_files'
  )

  _arguments -S $opts
}

_west_diff() {
  local -a opts=(
  {-a,--all}'[include inactive projects]'
  )

  _arguments -S $opts \
      "1:west proj:_get_west_projs"
}

_west_status() {
  local -a opts=(
  {-a,--all}'[include inactive projects]'
  )

  _arguments -S $opts \
      "1:west proj:_get_west_projs"
}

_west_forall() {
  local -a opts=(
  '-c[command to execute]:command:'
  {-a,--all}'[include inactive projects]'
  )

  _arguments -S $opts \
      "1:west proj:_get_west_projs"
}

_west_config() {
  local -a opts=(
  {-l,--list}'[list all options and values]'
  {-d,--delete}'[delete an option in one config file]'
  {-D,--delete-all}"[delete an option everywhere it\'s set]"
  + '(mutex)'
  '--system[system-wide file]'
  '--global[global user-wide file]'
  "--local[this workspace\'s file]"
  )

  _arguments -S $opts
}

_west_help() {
  _west_cmds
}

_west_completion() {

  _arguments -S "1:shell:(bash zsh)"
}

_west_boards() {
  local -a opts=(
  {-f,--format}'[format string]:format string:'
  {-n,--name}'[name regex]:regex:'
  '*--arch-root[Add an arch root]:arch root:_directories'
  '*--board-root[Add a board root]:board root:_directories'
  )

  _arguments -S $opts
}

_west_build() {
  local -a opts=(
  '(-b --board)'{-b,--board}'[board to build for]:board:_get_west_boards'
  '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories'
  '(-f --force)'{-f,--force}'[ignore errors and continue]'
  '--sysbuild[create multi-domain build system]'
  '--no-sysbuild[do not create multi-domain build system]'
  '(-c --cmake)'{-c,--cmake}'[force a cmake run]'
  '--cmake-only[just run cmake]'
  '--domain[execute build tool (make or ninja) for a given domain]:domain:'
  '(-t --target)'{-t,--target}'[run build system target]:target:'
  '(-T --test-item)'{-T,--test-item}'[Build based on test data in .yml]:test item:'
  {-o,--build-opt}'[options to pass to build tool (make or ninja)]:tool opt:'
  '(-n --just-print --dry-run --recon)'{-n,--just-print,--dry-run,--recon}"[just print build commands, don't run them]"
  '(-p --pristine)'{-p,--pristine}'[pristine build setting]:pristine:(auto always never)'
  )
  _arguments -S $opts \
      "1:source_dir:_directories"
}

_west_sign() {
  local -a opts=(
  '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories'
  '(-q --quiet)'{-q,--quiet}'[suppress non-error output]'
  '(-f --force)'{-f,--force}'[ignore errors and continue]'
  '(-t --tool)'{-t,--tool}'[image signing tool name]:tool:(imgtool rimage)'
  '(-p --tool-path)'{-p,--tool-path}'[path to the tool]:tool path:_directories'
  '(-D --tool-data)'{-D,--tool-data}'[path to tool data]:tool data path:_directories'
  '(--no-bin)--bin[produce a signed bin file]'
  '(--bin)--no-bin[do not produce a signed bin file]'
  '(-B --sbin)'{-B,--sbin}'[signed .bin filename]:bin filename:_files'
  '(--no-hex)--hex[produce a signed hex file]'
  '(--hex)--no-hex[do not produce a signed hex file]'
  '(-H --shex)'{-H,--shex}'[signed .hex filename]:hex filename:_files'
  )

  _arguments -S $opts
}

typeset -a -g _west_runner_opts=(
  '(-H --context)'{-H,--context}'[print runner-specific options]'
  '--board-dir[board directory]:board dir:_directories'
  '(-f --file)'{-f,--file}'[path to binary]:path to binary:_files'
  '(-t --file-type)'{-t,--file-type}'[type of binary]:type of binary:(hex bin elf)'
  '--elf-file[path to zephyr.elf]:path to zephyr.elf:_files'
  '--hex-file[path to zephyr.hex]:path to zephyr.hex:_files'
  '--bin-file[path to zephyr.bin]:path to zephyr.bin:_files'
  '--gdb[path to GDB]:path to GDB:_files'
  '--openocd[path to openocd]:path to openocd:_files'
  '--openocd-search[path to add to openocd search path]:openocd search:_directories'
)

_west_flash() {
  local -a opts=(
  '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories'
  '(-r --runner)'{-r,--runner}'[override default runner from build-dir]:runner:'
  '--skip-rebuild[do not refresh cmake dependencies first]'
  '--domain[execute build tool (make or ninja) for a given domain]:domain:'
  )

  local -a all_opts=(${_west_runner_opts} ${opts})
  _arguments -S $all_opts
}

_west_debug() {
  _west_flash
}

_west_debugserver() {
  _west_flash
}

_west_attach() {
  _west_flash
}

_west_spdx() {
  local -a opts=(
  '(-i --init)'{-i,--init}'[initialize CMake file-based API]'
  '(-d --build-dir)'{-d,--build-dir}'[build directory to create or use]:build dir:_directories'
  '(-n --namespace-prefix)'{-n,--namespace-prefix}'[namespace prefix]:namespace prefix:'
  '(-s --spdx-dir)'{-d,--spdx-dir}'[SPDX output directory]:spdx output dir:_directories'
  '--analyze-includes[also analyze included header files]'
  '--include-sdk[also generate SPDX document for SDK]'
  )
  _arguments -S $opts
}

_west_blobs() {
  local -a blob_cmds=(
  'list[list binary blobs]'
  'fetch[fetch binary blobs]'
  'clean[clean working tree of binary blobs]'
  )

  local line state

  _arguments -S -C \
          "1: :->cmds" \
          "*::arg:->args" \

  case "$state" in
  cmds)
    _values "west blob cmds" $blob_cmds
    ;;

  args)
    _opt_args=( ${(@kv)opt_args} )
    _call_function ret _west_blob_$line[1]
    ;;
  esac
}

_west_blob_list () {
  local -a opts=(
  {-f,--format}'[format string]:format string:'
  )

  _arguments -S $opts \
      "1:west proj:_get_west_projs"
}

_west_blob_fetch () {
  _arguments -S "1:west proj:_get_west_projs"
}

_west_blob_clean () {
  _arguments -S "1:west proj:_get_west_projs"
}

# don't run the completion function when being source-ed or eval-ed
if [ "$funcstack[1]" = "_west" ]; then
    _west
fi
