# 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),
      ]
    }
  }
}
