_fx_set__product_board() {
  compset -P "*."
  if [[ "$IPREFIX" = *. ]]; then
    # complete board
    compadd ${(u)$(echo ${fuchsia_dir}/boards/*.gni(N:t:r) ${fuchsia_dir}/vendor/*/boards/*.gni(N:t:r))}
  else
    # complete product followed by a dot
    compadd -S . ${(u)$(echo ${fuchsia_dir}/products/*.gni(N:t:r) ${fuchsia_dir}/vendor/*/products/*.gni(N:t:r))}
  fi
}

_fx_set__package_caching_policy() {
  test "${ninja_file}" -nt "$1"
}

# complete comma separated bundles labels
_fx_set__with() {
  local -a package_patterns=( "//bundles/*" "//garnet/packages/*" "//peridot/packages/*" "//topaz/packages/*" )
  for vendor in ${fuchsia_dir}/vendor/*(N/); do
    package_patterns+=( "//vendor/${vendor}/bundles" "//vendor/${vendor}/packages" )
  done

  # apply a default caching policy if one isn't configured
  local cache_policy
  zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
  zstyle ":completion:${curcontext}:" cache-policy \
      ${cache_policy:-_fx_set__package_caching_policy}

  # if this file is newer than the cache file then the cache is stale
  local ninja_file=${fuchsia_dir}/${fuchsia_build_dir}/build.ninja

  local -a fx_packages
  if ! _retrieve_cache fx_packages ; then
    fx_packages=( $(${fuchsia_dir}/buildtools/gn ls ${fuchsia_dir}/${fuchsia_build_dir} ${package_patterns[@]} ) )
    _store_cache fx_packages fx_packages
  fi

  compset -P "*,"
  compadd -q -S "," ${fx_packages}
}

_gn_args_caching_policy() {
  test ${ninja_file} -nt $1
}

_fx_set__gn_args() {
  if [ -z ${fuchsia_build_dir} ]; then
    return
  fi

  # apply a default caching policy if one isn't configured
  local cache_policy
  zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
  zstyle ":completion:${curcontext}:" cache-policy \
      ${cache_policy:-_gn_args_caching_policy}

  # if this file is newer than the cache file then the cache is stale
  local ninja_file=${fuchsia_dir}/${fuchsia_build_dir}/build.ninja

  local -a gn_args
  if ! _retrieve_cache gn_args ; then
    gn_args=( $(${fuchsia_dir}/buildtools/gn args ${fuchsia_dir}/${fuchsia_build_dir} --list --short|sed -e 's/ .*//') )
    _store_cache gn_args gn_args
  fi

  echo $gn_args
}

_fx_set__gn_arg_equals() {
  # complete the list of gn args with an = suffix
  compadd -S = (${fx_set_gn_args})
}

_fx_set__gn_arg_name() {
  # complete the list of gn args
  compadd (${fx_set_gn_args})
}

# TODO:
#  - complete --variant
#  - complete --fuzz-with

# arguments to fx set
_arguments '1:arch:{_fx_set__product_board}' \
  '(:)--with[Packages to include in the universe]:packages:_fx_set__with' \
  '(:)*--variant[Pass a select_variant GN arg]: ' \
  '(:)*--fuzz-with[A sanitizer name to fuzz with]: ' \
  '(:)*--args[Arguments for GN gen]:args:{_fx_set___gn_arg_equals}' \
  '(:)--help-args[Display GN argument documentation]:arg:{_fx_set__gn_arg_name}' \
  '(:)--goma[Use GOMA]' \
  "(:)--no-goma[Don't use GOMA]" \
  "(:)--no-ensure-goma[Don't make sure GOMA is running]" \
  '(:)--goma-dir[GOMA directory to use]:directory:_files -/' \
  "(:)--ccache[Use ccache]" \
  "(:)--no-ccache[Don't use ccache]" \
  '(:)--ide[Generate files for an IDE]:ide:(eclipse vs vs2013 vs2015 vs2017 xcode qcreator json)' \
  '(:)--release[Release build]'

