# Copyright 2013 The Flutter 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("//flutter/tools/fuchsia/fuchsia_debug_symbols.gni")
import("//flutter/tools/fuchsia/fuchsia_libs.gni")

# Creates a Fuchsia archive (.far) file using PM from the Fuchsia SDK.
template("fuchsia_archive") {
  assert(defined(invoker.binary), "package must define binary")
  assert(defined(invoker.meta_dir), "package must define meta_dir")

  pkg_testonly = defined(invoker.testonly) && invoker.testonly
  pkg_target_name = target_name
  pkg = {
    package_version = "0"  # placeholder
    forward_variables_from(invoker,
                           [
                             "binary",
                             "deps",
                             "meta",
                             "resources",
                             "libraries",
                             "meta_dir",
                           ])
    if (!defined(package_name)) {
      package_name = pkg_target_name
    }
    if (!defined(meta)) {
      meta = []
    }
    if (!defined(deps)) {
      deps = []
    }
    if (!defined(resources)) {
      resources = []
    }
    if (!defined(libraries)) {
      libraries = []
    }
  }

  far_base_dir = "$root_out_dir/${pkg_target_name}_far"

  copy_sources = [ "$root_out_dir/${invoker.binary}" ]
  copy_outputs = [ "$far_base_dir/bin/app" ]

  foreach(res, pkg.resources) {
    copy_sources += [ res.path ]
    copy_outputs += [ "$far_base_dir/data/${res.dest}" ]
  }

  foreach(lib, pkg.libraries) {
    copy_sources += [ "${lib.path}/${lib.name}" ]
    copy_outputs += [ "$far_base_dir/lib/${lib.name}" ]
  }

  cmx_target = "$pkg_target_name.copy_cmx"

  if (defined(invoker.cmx_file)) {
    cmx_file = invoker.cmx_file
  } else {
    cmx_file = "${pkg.meta_dir}/${pkg_target_name}.cmx"
  }

  copy("$cmx_target") {
    sources = [ "$cmx_file" ]
    outputs = [ "$far_base_dir/meta/${pkg_target_name}.cmx" ]
  }

  write_file("${far_base_dir}/meta/package",
             {
               name = pkg.package_name
               version = pkg.package_version
             },
             "json")

  _dbg_symbols_target = "${target_name}_dbg_symbols"
  fuchsia_debug_symbols(_dbg_symbols_target) {
    deps = pkg.deps
    testonly = pkg_testonly
    binary = invoker.binary
  }

  pkg_dir_deps = pkg.deps + [ ":$cmx_target" ]

  action("${target_name}_dir") {
    script = "//flutter/tools/fuchsia/copy_path.py"
    sources = copy_sources
    response_file_contents = rebase_path(copy_sources + copy_outputs)
    deps = pkg_dir_deps
    args = [ "--file-list={{response_file_name}}" ]
    outputs = copy_outputs
    testonly = pkg_testonly
  }

  manifest_json_file = "${root_out_dir}/${target_name}_package_manifest.json"
  action(target_name) {
    script = "//flutter/tools/fuchsia/gen_package.py"
    deps = pkg_dir_deps + [
             ":${target_name}_dir",
             ":${_dbg_symbols_target}",
           ]
    sources = copy_outputs

    inputs = []
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }

    args = [
      "--pm-bin",
      rebase_path("//fuchsia/sdk/$host_os/tools/pm"),
      "--package-dir",
      rebase_path(far_base_dir),
      "--far-name",
      target_name,
      "--manifest-json-file",
      rebase_path(manifest_json_file, root_build_dir),
    ]
    outputs = [
      manifest_json_file,
      "${far_base_dir}.manifest",
      "$root_out_dir/${target_name}-0.far",
    ]
    testonly = pkg_testonly
  }
}

template("fuchsia_test_archive") {
  fuchsia_archive(target_name) {
    testonly = true
    libraries = common_libs

    assert(defined(invoker.deps), "package must define deps")

    deps = invoker.deps
    binary = invoker.binary

    if (defined(invoker.resources)) {
      resources = invoker.resources
    }

    if (defined(invoker.libraries)) {
      libraries += invoker.libraries
    }

    meta_dir = "//flutter/testing/fuchsia/meta"
    cmx_file = "$meta_dir/fuchsia_test.cmx"
  }
}
