_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}/prebuilt/third_party/gn/${prebuilt_os}/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}/prebuilt/third_party/gn/${prebuilt_os}/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}' \
  '(:)--auto-dir[Act like `fx --dir out/PRODUCT.BOARD set ...`]' \
  '(:)--with[Packages to include in the universe]:packages:_fx_set__with' \
  '(:)--with-base[Additional packages to include in the base]: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]'

