# Copyright 2017 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/dart/dart_library.gni")
import("//build/dart/dart_package_config.gni")
import("//build/dart/toolchain.gni")

# Wraps a dart snapshot in a script to be invoked by dart
#
# Parameters
#
#   dart (required)
#     The path to the dart binary
#
#   snapshot (required)
#     The path to the dart snapshot
#
#   deps (optional)
#     Dependencies of this application
#
#   output_name (optional)
#     Name of the output file to generate. Defaults to $target_name.
template("_dart_snapshot_invocation") {
  assert(defined(invoker.dart), "Must specify the path to the dart binary")
  assert(defined(invoker.snapshot),
         "Must specify the path to the dart snapshot")

  if (defined(invoker.output_name)) {
    app_name = invoker.output_name
  } else {
    app_name = target_name
  }

  # Builds a convenience script to invoke the app.
  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "deps",
                           ])

    script = "//build/dart/gen_app_invocation.py"

    app_path = "$root_out_dir/dart-tools/$app_name"
    dart_binary = invoker.dart
    snapshot = invoker.snapshot

    inputs = [
      dart_binary,
      snapshot,
    ]
    outputs = [ app_path ]

    args = [
      "--out",
      rebase_path(app_path),
      "--dart",
      rebase_path(dart_binary),
      "--snapshot",
      rebase_path(snapshot),
    ]

    metadata = {
      # Record metadata for the //:tool_paths build API.
      tool_paths = [
        {
          cpu = current_cpu
          label = get_label_info(":$target_name", "label_with_toolchain")
          name = app_name
          os = current_os
          path = rebase_path(app_path, root_build_dir)
        },
      ]
    }
  }
}

# Defines a Dart application that can be run on the host
#
# Parameters
#
#   sources (optional)
#     The list of public sources in this library, i.e. Dart files in lib/ but
#     not in lib/src/. These sources must be within lib/.
#
#   package_name (optional)
#     Name of the dart package.
#
#   main_dart (required)
#     File containing the main function of the application.
#
#   deps (optional)
#     Dependencies of this application
#
#   non_dart_deps (optional)
#     List of labels this package depends on that are not Dart packages. It
#     typically doesn't need to be set.
#
#   output_name (optional)
#     Name of the output file to generate. Defaults to $target_name.
#
#   disable_analysis (optional)
#     Prevents analysis from being run on this target.
template("dart_tool") {
  assert(defined(invoker.main_dart), "Must specify main_dart file")

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

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

  dart_library_target_name = target_name + "_dart_library"

  if (defined(invoker.package_name)) {
    package_name = invoker.package_name
  } else if (!defined(invoker.infer_package_name) ||
             invoker.infer_package_name) {
    # Compute a package name from the label:
    #   //foo/bar --> foo.bar
    #   //foo/bar:blah --> foo.bar._blah
    #   //garnet/public/foo/bar --> foo.bar
    # Strip public directories.
    full_dir = get_label_info(":$dart_library_target_name", "dir")
    foreach(sdk_dir, sdk_dirs) {
      full_dir = string_replace(full_dir, "$sdk_dir/", "")
    }
    package_name = full_dir
    package_name = string_replace(package_name, "//", "")
    package_name = string_replace(package_name, "/", ".")

    # If the last directory name does not match the target name, add the
    # target name to the resulting package name.
    name = get_label_info(":$dart_library_target_name", "name")
    last_dir = get_path_info(full_dir, "name")
    if (last_dir != name) {
      package_name = "$package_name._$name"
    }
  } else {
    assert(false, "Must specify either a package_name or infer_package_name")
  }

  package_root = "."
  if (defined(invoker.package_root)) {
    package_root = invoker.package_root
  }

  source_dir = "$package_root/lib"
  if (defined(invoker.source_dir)) {
    source_dir = "$package_root/${invoker.source_dir}"
  }

  dart_library(dart_library_target_name) {
    forward_variables_from(invoker,
                           [
                             "disable_analysis",
                             "disable_metadata_entry",
                             "language_version",
                             "testonly",
                             "visibility",
                           ])
    package_name = package_name
    package_root = package_root
    source_dir = source_dir

    sources = []
    if (defined(invoker.sources)) {
      sources += invoker.sources
    }
    source_base = "lib"
    if (defined(invoker.source_dir)) {
      source_base = invoker.source_dir
    }
    sources += [ rebase_path(invoker.main_dart, source_base) ]
    deps = _dart_deps
  }

  # We only need to make a library if we are specifying sources.
  # If no sources are defined we still want to depend on the library
  # so we can run analysis on the main file.
  if (defined(invoker.sources)) {
    _dart_deps += [ ":$dart_library_target_name" ]
  } else {
    _tool_deps += [ ":$dart_library_target_name" ]
  }

  dart_binary = prebuilt_dart
  sdk_deps = []

  snapshot_path = "$target_gen_dir/${target_name}.snapshot"
  depfile_path = "${snapshot_path}.d"

  snapshot_target_name = target_name + "_snapshot"

  _dart_package_config_target_name = "${target_name}_dart_package"
  dart_package_config(_dart_package_config_target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    deps = _dart_deps
  }

  _package_config_output = []
  _package_config_output =
      get_target_outputs(":$_dart_package_config_target_name")
  _packages_path = _package_config_output[0]

  # Creates a snapshot file.
  # The main advantage of snapshotting is that it sets up source dependencies
  # via a depfile so that a Dart app gets properly rebuilt when one of its
  # sources is modified.
  action(snapshot_target_name) {
    hermetic_deps = false
    if (defined(invoker.testonly)) {
      testonly = invoker.testonly
    }

    depfile = depfile_path

    outputs = [ snapshot_path ]

    script = dart_binary

    # The snapshot path needs to be rebased on top of the root build dir so
    # that the resulting depfile gets properly formatted.
    rebased_snapshot_path = rebase_path(snapshot_path, root_build_dir)
    rebased_depfile_path = rebase_path(depfile_path)
    rebased_packages_path = rebase_path(_packages_path)

    main_uri = rebase_path(invoker.main_dart)

    # If we have sources defined we can check to see if the main file is included
    # in the source list. If so, we want to call the snapshot generation with
    # the `package:foo/main.dart` style. If not we want to pass in a file uri.
    if (defined(invoker.sources)) {
      package_relative = rebase_path(invoker.main_dart, source_dir)

      # Approximation for source_dir contains main_dart.
      if (get_path_info(get_path_info(package_relative, "dir"), "file") !=
          "bin") {
        main_uri = "package:" + package_name + "/" + package_relative
      }
    }

    args = [
      "--enable-experiment=non-nullable",
      "--no-sound-null-safety",
      "--snapshot=$rebased_snapshot_path",
      "--snapshot-depfile=$rebased_depfile_path",
      "--packages=$rebased_packages_path",
      main_uri,
    ]

    deps = sdk_deps + [ ":$_dart_package_config_target_name" ]
  }

  # Builds a convenience script to invoke the app.
  _dart_snapshot_invocation(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "output_name",
                           ])
    dart = dart_binary
    snapshot = snapshot_path

    deps = sdk_deps + _tool_deps + [ ":$snapshot_target_name" ]
  }
}

# Defines a Dart application that can be run on the host which is
# compiled from an existing snapshot
#
# Parameters
#
#   snapshot (required)
#     The path to the dart snapshot
#
#   deps (optional)
#     Dependencies of this application
#
#   output_name (optional)
#     Name of the output file to generate. Defaults to $target_name.
template("dart_prebuilt_tool") {
  assert(defined(invoker.snapshot),
         "Must specify the path to the dart snapshot")
  _dart_snapshot_invocation(target_name) {
    dart = prebuilt_dart
    forward_variables_from(invoker, "*")
  }
}
