# Copyright 2021 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Template to package an app extension into an app.
#
# Parameters
#
#   extension_target:
#     name of the extension target to package; the extension
#     bundle name must be derived from the target name
#
#   extension_name:
#     (optional) name of the extension appex file; derived from
#     the target name if omitted
#
template("extension_bundle_data") {
  assert(defined(invoker.extension_target),
         "extension_target must be defined for $target_name")

  _extension_name = get_label_info(invoker.extension_target, "name") + ".appex"
  if (defined(invoker.extension_name)) {
    _extension_name = invoker.extension_name
  }

  _extension_dir = "PlugIns"
  if (defined(invoker.extension_dir)) {
    _extension_dir = invoker.extension_dir
  }

  if (defined(invoker.variants) && invoker.variants != []) {
    _variants = []
    foreach(_variant, invoker.variants) {
      _variants += [
        {
          name = _variant.name
        },
      ]
    }
  } else {
    _variants = []
  }

  _target_name = target_name
  if (_variants != []) {
    foreach(_variant, _variants) {
      _extension_target =
          get_label_info(invoker.extension_target, "label_no_toolchain") +
          "_variants_${_variant.name}" + "(" +
          get_label_info(invoker.extension_target, "toolchain") + ")"

      bundle_data("${_target_name}_variants_${_variant.name}") {
        forward_variables_from(invoker, [ "testonly" ])
        public_deps = [ _extension_target ]
        outputs =
            [ "{{bundle_contents_dir}}/$_extension_dir/{{source_file_part}}" ]
        sources = [ get_label_info(_extension_target, "root_out_dir") +
                    "/variants/${_variant.name}/$_extension_name" ]
      }
    }
  }

  bundle_data(_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = [ invoker.extension_target ]
    outputs = [ "{{bundle_contents_dir}}/$_extension_dir/{{source_file_part}}" ]
    sources = [ get_label_info(invoker.extension_target, "root_out_dir") +
                "/$_extension_name" ]
  }
}
