# 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/fidl/toolchain.gni")

# Declares a source_set that contains code generated by fidlmerge from a
# template and a FIDL JSON file.
#
# Parameters
#
#   fidl_target (required)
#     Specifies the fidl target from which to read fidl json. For example,
#     "//zircon/system/fidl/fuchsia-mem" for fuchsia.mem or
#     "//sdk/fidl/fuchsia.sys" for fuchsia.sys.
#
#   template_path (required)
#     Specifies the template to use to generate the source code for the
#     source_set. For example, "//garnet/public/build/fostr/fostr.fidlmerge".
#
#   generated_source_base (required)
#     The base file name from which the source_set's 'source' file names are
#     generated. For example, "formatting".
#
#   options (optional)
#     A single string with comma-separated key=value pairs.
#
#   amendments_path (optional)
#     Specifies a JSON file that contains amendments to be made to the fidl
#     model before the template is applied. For example,
#     "//garnet/public/build/fostr/fidl/fuchsia.media/amendments.fidlmerge".
#     See the fidlmerge README for details.
#
#   deps, public_deps, test_only, visibility (optional)
#     These parameters are forwarded to the source_set.
#

template("fidlmerge_dart") {
  assert(defined(invoker.fidl_target),
         "fidlmerge_dart requires parameter fidl_target.")

  assert(defined(invoker.template_path),
         "fidlmerge_dart requires parameter template_path.")

  assert(defined(invoker.generated_source_base),
         "fidlmerge_dart requires parameter generated_source_base.")

  fidl_target = invoker.fidl_target
  template_path = invoker.template_path
  source_base = invoker.generated_source_base

  generation_target_name = "${target_name}_generate"

  fidl_target_gen_dir =
      get_label_info("$fidl_target($fidl_toolchain)", "target_gen_dir")
  fidl_target_name = get_path_info(fidl_target_gen_dir, "file")
  json_representation = "$fidl_target_gen_dir/$fidl_target_name.fidl.json"

  # Subtle: rebase dance, so that we allow paths up to and including the build
  # dir to contain periods:
  include_stem =
      string_replace(rebase_path(target_gen_dir, root_build_dir), ".", "/")
  file_stem = "$root_build_dir/$include_stem/$source_base"

  compiled_action(generation_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]

    tool = "//garnet/go/src/fidlmerge"

    inputs = [
      json_representation,
      template_path,
    ]

    outputs = [ "$file_stem.dart" ]

    args = [
      "--template",
      rebase_path(template_path, root_build_dir),
      "--json",
      rebase_path(json_representation, root_build_dir),
      "--output-base",
      rebase_path(file_stem, root_build_dir),
    ]

    if (defined(invoker.options)) {
      args += [
        "--options",
        invoker.options,
      ]
    }

    if (defined(invoker.amendments_path)) {
      args += [
        "--amend",
        rebase_path(invoker.amendments_path, root_build_dir),
      ]
    }

    deps = [ "$fidl_target($fidl_toolchain)" ]

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

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

  library_name = target_name
  root_dir = "$target_gen_dir/${library_name}_package"

  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" ]
  }

  copy(copy_source_target_name) {
    sources = [ "$file_stem.dart" ]
    outputs = [ "$root_dir/lib/$source_base.dart" ]

    deps = [ ":$generation_target_name" ]
  }

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

    package_root = root_dir

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

    sources = [ "$source_base.dart" ]

    deps = []

    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",
      ":$copy_source_target_name",
    ]
  }
}
