# Copyright 2013 The Flutter 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("//flutter/tools/fuchsia/dart/dart.gni")
import("//flutter/tools/fuchsia/dart/dart_library.gni")
import("//flutter/tools/fuchsia/flutter/config.gni")
import("//flutter/tools/fuchsia/flutter/internal/flutter_dart_component.gni")

# Defines a Flutter component which can be used in a fuchsia package
#
# Flutter 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" ]
#   deps = [ "//third_party/dart-pkg/git/flutter/packages/flutter" ]
# }
# ```
#
# 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 in the `resources` variable.
#
# ```
# flutter_component("my-component") {
#   manifest = "meta/my-component.cmx"
#   main_package = "my_library"
#   resources = [
#     {
#       path = "text_file.txt"
#       dest = "data/text_file.txt"
#     },
#   ]
#   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 //flutter/tools/fuchsia/flutter/flutter_build_config.gni for predefined configs.
#
#  deps
#  testonly
#  visibility
template("flutter_component") {
  assert(defined(invoker.manifest), "Must define manifest")

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

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

  if (defined(invoker.component_name)) {
    _component_name = invoker.component_name
  } else {
    _component_name = target_name
  }

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

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

  # We need to specify the runner as a dependency (at least when running a
  # flutter/engine-built package using a flutter/engine-built runner). Add it
  # to `deps` so the runner will also be built, and available to serve to
  # fuchsia, alongside the flutter_component's package.
  _component_deps += [ _build_cfg.runner_dep ]

  flutter_dart_component(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "build_cfg",
                             "deps",
                             "main_dart",
                             "main_package",
                             "component_name",
                             "resources",
                           ])
    deps = _component_deps

    main_dart = _main_dart
    main_package = _main_package
    component_name = _component_name

    build_cfg = _build_cfg
  }
}
