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