# 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"
  bindings_file = "$bindings_dir/fidl.dart"
  async_bindings_file = "$bindings_dir/fidl_async.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 = [
      bindings_file,
      async_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),
      "--dartfmt",
      rebase_path("$dart_sdk/bin/dartfmt"),
    ]

    deps = dart_sdk_deps + [
      ":$main_target_name($fidl_toolchain)",
    ]
  }

  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(bindings_file, bindings_dir),
      rebase_path(async_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)"
    }
  }
}
