# Copyright 2018 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/compiled_action.gni")
import("//build/dart/dart_library.gni")
import("//build/dart/toolchain.gni")
import("//build/fidl/toolchain.gni")
import("//build/sdk/sdk_atom_alias.gni")

# Generates some Dart bindings for a FIDL library.
#
# The parameters for this template are defined in //build/fidl/fidl.gni. The
# relevant parameters in this template are:
#   - name;
#   - sdk_category.

template("fidl_dart") {
  assert(current_toolchain == dart_toolchain,
         "This template can only be used in the $dart_toolchain toolchain.")

  not_needed(invoker, [ "sources" ])

  main_target_name = target_name
  generation_target_name = "${target_name}_dart_generate"

  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }
  root_dir = "$target_gen_dir/${library_name}_package"
  bindings_dir = "$root_dir/lib"
  async_bindings_file = "$bindings_dir/fidl_async.dart"
  test_bindings_file = "$bindings_dir/fidl_test.dart"

  fidl_target_gen_dir =
      get_label_info(":bogus($fidl_toolchain)", "target_gen_dir")
  json_representation = "$fidl_target_gen_dir/$target_name.fidl.json"

  compiled_action(generation_target_name) {
    visibility = [ ":*" ]

    tool = "//topaz/bin/fidlgen_dart"

    inputs = [
      json_representation,
    ]

    outputs = [
      async_bindings_file,
      test_bindings_file,
    ]

    args = [
      "--json",
      rebase_path(json_representation, root_build_dir),
      "--output-base",
      rebase_path(bindings_dir, root_build_dir),
      "--include-base",
      rebase_path(root_gen_dir, root_build_dir),
    ]

    # Don't run the formatter if we are using a custom-built Dart SDK in a
    # cross-build.
    deps = [
      ":$main_target_name($fidl_toolchain)",
    ]
    if (use_prebuilt_dart_sdk || host_cpu == target_cpu) {
      args += [
        "--dartfmt",
        rebase_path("$dart_sdk/bin/dartfmt"),
      ]
      deps += dart_sdk_deps
    }
  }

  copy_pubspec_target_name = "${target_name}_dart_pubspec"
  copy_options_target_name = "${target_name}_dart_options"

  copy(copy_pubspec_target_name) {
    sources = [
      "//build/dart/empty_pubspec.yaml",
    ]

    outputs = [
      "$root_dir/pubspec.yaml",
    ]
  }

  copy(copy_options_target_name) {
    sources = [
      "//topaz/tools/analysis_options.yaml",
    ]

    outputs = [
      "$root_dir/analysis_options.yaml",
    ]
  }

  dart_library(main_target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    package_root = root_dir

    package_name = "fidl_" + string_replace(library_name, ".", "_")

    sources = [
      rebase_path(async_bindings_file, bindings_dir),
      rebase_path(test_bindings_file, bindings_dir),
    ]

    deps = [
      "//topaz/public/dart/fidl",
      "//topaz/public/dart/zircon",
    ]

    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (defined(invoker.public_deps)) {
      deps += invoker.public_deps
    }

    non_dart_deps = [
      ":$copy_options_target_name",
      ":$copy_pubspec_target_name",
      ":$generation_target_name",
    ]
  }

  if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
    # Instead of depending on the generated bindings, set up a dependency on the
    # original library.
    sdk_target_name = "${main_target_name}_sdk"
    sdk_atom_alias(sdk_target_name) {
      atom = ":$sdk_target_name($fidl_toolchain)"
    }
  }
}
