# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/python_action.gni")

# GN target that creates update bundles.
#
# Args:
#   out: Filename at which to output the serialized update bundle.
#   targets: List of targets mapping filenames to target names.
#   persist: Optional boolean; if true, the raw tuf repo will be persisted to
#       disk in the target out dir in addition to being serialized as a bundle.
#   user_manifest: Optional path to an extra user-defined manifest file; if
#       provided, this file will be included as a target payload, but handled
#       specially. See the following file for details:
#         pw_software_update/public/pw_software_update/bundled_update_backend.h
#   targets_metadata_version: Optional manually-specified int version number for
#       the targets metadata.
#   targets_metadata_version_file: Optional manually-specified path/to/file
#        containing int version number for the targets metadata. Cannot be
#        specified together with targets_metadata_version
#   signed_root_metadata: Optional path to a .pb file containing a serialized
#       SignedRootMetadata (generated and signed via the tools in the
#       pw_software_update Python module).
#
# Each target in targets should be a string formatted as follows:
#   "/path/to/file > target_name"

template("pw_update_bundle") {
  assert(defined(invoker.out), "An output path must be provided via 'out'")
  assert(defined(invoker.targets),
         "A list of targets must be provided via 'targets'")

  pw_python_action(target_name) {
    _delimiter = ">"
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                           ])
    _out_path = invoker.out
    _persist_path = ""
    if (defined(invoker.persist) && invoker.persist) {
      _persist_path = "${target_out_dir}/${target_name}/tuf_repo"
    }
    module = "pw_software_update.update_bundle"
    python_deps = [ "$dir_pw_software_update/py" ]
    args = [
      "--out",
      rebase_path(_out_path),
      "--targets",
    ]
    outputs = [ _out_path ]

    foreach(tuf_target, invoker.targets) {
      # Remove possible spaces around the delimiter before splitting
      tuf_target = string_replace(tuf_target, " $_delimiter", _delimiter)
      tuf_target = string_replace(tuf_target, "$_delimiter ", _delimiter)

      tuf_target_list = []
      tuf_target_list = string_split(tuf_target, _delimiter)
      tuf_target_path = rebase_path(tuf_target_list[0], root_build_dir)
      tuf_target_name = tuf_target_list[1]
      assert(tuf_target_name != "user_manifest",
             "The target name 'user_manifest' is reserved for special use.")
      args += [ "${tuf_target_path} > ${tuf_target_name}" ]
      if (_persist_path != "") {
        outputs += [ "${_persist_path}/${tuf_target_name}" ]
      }
    }

    if (defined(invoker.user_manifest)) {
      args += [ rebase_path(invoker.user_manifest, root_build_dir) +
                " > user_manifest" ]
    }

    if (_persist_path != "") {
      args += [
        "--persist",
        rebase_path(_persist_path),
      ]
    }

    if (defined(invoker.targets_metadata_version)) {
      args += [
        "--targets-metadata-version",
        invoker.targets_metadata_version,
      ]
    }

    if (defined(invoker.targets_metadata_version_file)) {
      args += [
        "--targets-metadata-version-file",
        rebase_path(invoker.targets_metadata_version_file),
      ]
    }

    assert(
        !(defined(invoker.targets_metadata_version_file) &&
              defined(invoker.targets_metadata_version)),
        "Only one of targets_metadata_version and targets_metadata_version_file can be specified")

    if (defined(invoker.signed_root_metadata)) {
      args += [
        "--signed-root-metadata",
        rebase_path(invoker.signed_root_metadata),
      ]
    }
  }
}
