# Copyright 2020 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/dart/config.gni")  # For dart_force_product
import("//build/dart/dart.gni")
import("//build/flutter/internal/flutter_dart_component.gni")

# Defines a Dart component which can be used in a fuchsia package
#
# Dart components require at least one library which contains a main
# entry point. The library should be defined using the dart_library.gni.
#
# ```
# dart_library("lib") {
#   package_name = "my_library"
#   sources = [ "main.dart" ]
# }
# ```
#
# Once a library is defined a flutter component can be created which
# depends on this package. If the component needs any other resources they may
# be defined using the resource target and added to the components deps.
#
# ```
# resource("text-file") {
#   sources = [ "text_file.txt" ]
#   outputs = [ "data/text_file.txt" ]
# }
#
# dart_component("my-component") {
#   manifest = "meta/my-component.cmx"
#   main_package = "my_library"
#   deps = [
#     ":lib",
#     ":text-file",
#   ]
# }
# ```
#
# Once a component is defined it can be added as a dep of a fuchsia_package
# ```
# fuchsia_package("my-package") {
#   deps = [
#     ":my-component",
#   ]
# }
# ```
#
# Parameters
#
#   manifest (required)
#     The component manifest
#     Type: path
#
#   main_package (optional)
#     The name of the package containing main_dart
#     Type: string
#     Default: component_name with dashes replaced by underscores, if defined.
#       Otherwise, the target_name with dashes replaced by underscores will be
#       used.
#
#   component_name (optional)
#     The name of the component.
#     Type: string
#     Default: target_name
#
#   main_dart (optional)
#     File containing the main function of the component.
#     Type: string
#     Default: main.dart
#
#   package_root (optional)
#     The root of the package generated for this component. Each component must
#     have a unique package_root. For each component, there must be a
#     pubspec.yaml and an analysis_options.yaml at the package root.
#     Type: path
#     Default: "."
#
#   build_cfg (optional)
#     Specifies the parameters for building the component.
#     See //build/dart/dart_build_config.gni for predefined configs.
#
#   null_safe (optional)
#    If true, this component will be compiled with --sound-null-safety
#
#  deps
#  testonly
#  visibility
template("dart_component") {
  assert(defined(invoker.manifest), "Must define manifest")

  if (defined(invoker.build_cfg)) {
    _build_cfg = invoker.build_cfg
  } else {
    _build_cfg = dart_default_build_cfg
  }

  _component_deps = [ _build_cfg.runner_dep ]
  if (defined(invoker.deps)) {
    _component_deps += invoker.deps
  }

  if (defined(invoker.main_dart)) {
    _main_dart = invoker.main_dart
  } else {
    _main_dart = "main.dart"
  }

  if (defined(invoker.main_package)) {
    _main_package = invoker.main_package
  } else if (defined(invoker.component_name)) {
    _main_package = string_replace(invoker.component_name, "-", "_")
  } else {
    _main_package = string_replace(target_name, "-", "_")
  }

  flutter_dart_component(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "main_package",
                             "build_cfg",
                             "deps",
                             "main_dart",
                             "null_safe",
                           ])
    main_package = _main_package
    deps = _component_deps
    main_dart = _main_dart
    build_cfg = _build_cfg

    generate_asset_manifest = false
  }
}
