# 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/public/fidl/fuchsia-mem" for fuchsia.mem or
#     "//garnet/public/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"

  include_stem = string_replace(target_gen_dir, ".", "/")
  file_stem = "$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",
    ]
  }
}
