# Copyright 2022 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/bazel/bazel_workspace.gni")
import("//build/images/args.gni")
import("//build/python/python_action.gni")

assert(is_fuchsia,
       "Assembly templates can only be used with `$default_toolchain`.")

# Collect a newline-delimited text file of the package manifests for all
# packages in a given package set from the `ffx assembly product` call.
#
# Arguments:
#
#   package_set (string, required)
#     Which package set to get.  Valid values are:
#       base
#       cache
#       on_demand
#
#   assembly_label (GN label, required)
#     Label for the assembled_system() invocation to use, e.g. //build/images/fuchsia.
#
#   is_bazel_assembled (bool, required)
#     Whether the assembly label corresponds to a Bazel-assembled or GN-assembled product.
#     Typically you'd want this value to be the same as `use_bazel_images_only`.
#
#   namespace (string, optional)
#     The effective namespace used by the system label.
#     Defaults to the 'name' of the label in 'assembly_label'.
#     Only applicable for GN/non-Bazel assembly.
#
#   outputs (list of paths, required)
#     Usual GN meaning, expects a single file to write to.
#
#   testonly
#   visibility
template("packages_from_product_assembler") {
  assert(
      defined(invoker.assembly_label),
      "must define a `assembly_label` argument which points to an assembled_system() invocation")
  assert(defined(invoker.outputs), "must define `outputs`")
  assert(defined(invoker.is_bazel_assembled),
         "must define `is_bazel_assembled`")
  assert(!invoker.is_bazel_assembled || !defined(invoker.namespace),
         "`namespace` is not allowed for Bazel-assembled products!")

  assert(
      defined(invoker.package_set),
      "must define a `package_set` argument specifying which package set to list")
  valid_package_sets = [
    "base",
    "cache",
    "on_demand",
  ]
  assert(valid_package_sets + [ invoker.package_set ] -
             [ invoker.package_set ] != valid_package_sets,
         "the `package_set` argument must be one of: ${valid_package_sets}")

  _assembly_target_name = get_label_info(invoker.assembly_label, "name")
  _assembly_dir = get_label_info(invoker.assembly_label, "dir")
  _assembly_namespace = _assembly_target_name
  _is_bazel_assembled = invoker.is_bazel_assembled
  if (defined(invoker.namespace)) {
    _assembly_namespace = invoker.namespace
  }

  if (_is_bazel_assembled) {
    _assembly_gen_dir = get_label_info(invoker.assembly_label, "target_out_dir")
    _assembly_manifest = "${_assembly_gen_dir}/${_assembly_target_name}_product_assembly/image_assembly.json"
    _assembly_dep = "${_assembly_dir}:${_assembly_namespace}_product_assembly"
  } else {
    _assembly_out_dir = get_label_info(invoker.assembly_label, "target_out_dir")
    _assembly_manifest =
        "${_assembly_out_dir}/${_assembly_target_name}/image_assembly.json"
    _assembly_dep = "${_assembly_dir}:${_assembly_namespace}.product_assembler"
  }

  python_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "outputs",
                             "testonly",
                             "visibility",
                           ])
    binary_label = "//build/assembly/scripts:packages_from_product_assembler"
    args = [
      "--assembly-manifest",
      rebase_path(_assembly_manifest, root_build_dir),
      "--package-set",
      invoker.package_set,
      "--output",
      rebase_path(outputs[0], root_build_dir),
    ]
    if (_is_bazel_assembled) {
      args += [
        "--bazel-execroot",
        rebase_path(bazel_execroot, root_build_dir),
      ]
    }
    inputs = [ _assembly_manifest ]
    deps = [ _assembly_dep ]
  }
}
