# 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.

assert(is_fuchsia || is_fuchsia_host)

import("//build/package.gni")
import("//build/tools/json_merge/json_merge.gni")
import("//third_party/dart/build/dart/dart_action.gni")
import("//topaz/runtime/dart/config.gni")
import("//topaz/runtime/dart/dart_component.gni")
import("//topaz/runtime/dart/dart_kernel.gni")

# Defines JIT runtime components to be further distributed in one package.
#
# Takes a set of flutter components and puts them into one fuchsia package with
# the flutter_jit_runner as its runtime. Also supports legacy calls where the
# components parameter isn't specified, in which we will create one default
# component for the package.
#
# Parameters
#
#   components (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the resources list:
#
#       component_name (required)
#         Name of the component.
#
#       main_dart (required)
#         File containing the main function of the component.
#
#       dart_package_name (optional)
#         Name of the dart package for the component. If not provided, it will
#         be inferred from the component name.
#
#       package_root (optional)
#         Path to the dart package for the component. If not provided, it will
#         be assumed as ".".
#
#       sources (optional)
#         Relative path of source files to be included in the dart package for
#         the component at $package_root/lib.
#
#   main_dart (required)
#     File containing the main function of the application. Either main_dart or
#     components must be defined, but not both.
#
#   package_name (optional)
#     Name of the Dart package. This is used as an identifier in code that
#     depends on the dart library that the *one and only* component generates.
#     Only compatible when components is not specified (use
#     components.dart_package_name).
#
template("_flutter_jit_component") {
  pkg_name = target_name
  legacy_component = false
  if (!defined(invoker.components)) {
    # If components is not specified, we are fitting main_dart into a component
    # scope, and using that for the package.
    #
    # TODO(CP-140): Remove support for legacy_component once all existing calls
    # to flutter_app() have a components parameter.
    legacy_component = true
    if (defined(invoker.fuchsia_package_name)) {
      legacy_component_name = invoker.fuchsia_package_name
    } else {
      legacy_component_name = target_name
    }
    pkg_name = legacy_component_name
    pkg_sources = []
    if (defined(invoker.sources)) {
      pkg_sources = invoker.sources
    }
    components = [
      {
        main_dart = invoker.main_dart
        component_name = legacy_component_name
        component_type = "flutter"
        package_root = "."
        deps = invoker.deps
        sources = pkg_sources
      },
    ]
  }
  flutter_dart_jit_component(target_name) {
    forward_variables_from(invoker, "*")
  }
}

# Defines AOT runtime components to be further distributed in one package.
#
# Takes a set of flutter components and puts them into one fuchsia package with
# the flutter_aot_runner as its runtime. Also supports legacy calls where the
# components parameter isn't specified, in which we will create one default
# component for the package.
#
# Parameters
#
#   components (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the resources list:
#
#       component_name (required)
#         Name of the component.
#
#       main_dart (required)
#         File containing the main function of the component.
#
#       dart_package_name (optional)
#         Name of the dart package for the component. If not provided, it will
#         be inferred from the component name.
#
#       package_root (optional)
#         Path to the dart package for the component. If not provided, it will
#         be assumed as ".".
#
#       sources (optional)
#         Relative path of source files to be included in the dart package for
#         the component at $package_root/lib.
#
#   main_dart (required)
#     File containing the main function of the application. Either main_dart or
#     components must be defined, but not both.
#
#   package_name (optional)
#     Name of the Dart package. This is used as an identifier in code that
#     depends on the dart library that the *one and only* component generates.
#     Only compatible when components is not specified (use
#     components.dart_package_name).
#
template("_flutter_aot_component") {
  # This variable isn't needed in AOT builds.
  if (defined(invoker.flutter_driver_extendable)) {
    not_needed(invoker, [ "flutter_driver_extendable" ])
  }
  pkg_name = target_name
  legacy_component = false
  if (!defined(invoker.components)) {
    # If components is not specified, we are fitting main_dart into a component
    # scope, and using that for the package.
    #
    # TODO(CP-140): Remove support for legacy_component once all existing calls
    # to flutter_app() have a components parameter.
    legacy_component = true
    if (defined(invoker.fuchsia_package_name)) {
      legacy_component_name = invoker.fuchsia_package_name
    } else {
      legacy_component_name = target_name
    }
    pkg_name = legacy_component_name
    pkg_sources = []
    if (defined(invoker.sources)) {
      pkg_sources = invoker.sources
    }
    components = [
      {
        main_dart = invoker.main_dart
        component_name = legacy_component_name
        component_type = "flutter"
        package_root = "."
        deps = invoker.deps
        sources = pkg_sources
      },
    ]
  }
  flutter_dart_aot_component(target_name) {
    forward_variables_from(invoker, "*")
  }
}

template("flutter_jit_app") {
  template_name = "_flutter_jit_component"
  if (dart_force_product) {
    template_name = flutter_product_app
  }

  target(template_name, target_name) {
    forward_variables_from(invoker, "*")
  }
}

template("flutter_aot_app") {
  template_name = "_flutter_aot_component"
  if (dart_force_product) {
    template_name = flutter_product_app
  }

  target(template_name, target_name) {
    forward_variables_from(invoker, "*", [ "space_dart" ])
  }
}

# Defines a Flutter application
#
# Parameters
#
#   main_dart (required)
#     Name of the Dart file containing the main function. Either main_dart or
#     components must be defined, but not both.
#
#   package_name (optional)
#     Name of the Dart package.
#
#   fuchsia_package_name (optional)
#     Name of the Fuchsia package.
#
#   deps (optional)
#     List of Dart packages the application depends on.
#
#   manifest (optional)
#     Path to the manifest file
#
#   disable_analysis (optional)
#     Prevents analysis from being run on this target.
#
#   product (optional)
#     A boolean. Whether to build/run the app in a stripped-down Dart VM.
#     Defaults to !is_debug.
#
#   flutter_driver_extendable (optional)
#     A boolean. Determines if, in a debug build, this package will be built
#     with a wrapper that auto-enables flutter driver extensions when running
#     the application in a an environment that includes TestRunner. Does not
#     affect AOT or release builds.
#
#   components (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the resources list:
#
#       component_name (required)
#         Name of the component.
#
#       main_dart (required)
#         File containing the main function of the component.
#
#       package_root (optional)
#         Path to the dart package for the component. If not provided, it will
#         be assumed as ".".
#
#       sources (optional)
#         Relative path of source files to be included in the dart package for
#         the component at $package_root/lib.
#
template("flutter_app") {
  assert((defined(invoker.components) && !defined(invoker.main_dart)) ||
             (!defined(invoker.components) && defined(invoker.main_dart)),
         "Only one of components or main_dart should be defined")
  target(flutter_default_app, target_name) {
    forward_variables_from(invoker, "*", [ "aot" ])
  }
}

# Defines multiple Flutter/Dart applications in one fuchsia package
#
# Parameters
#
#   components (required)
#     [list of scopes] Defines the components in the package. Either main_dart
#     or components must be defined, but not both.
#
#     Entries in a scope in the resources list:
#
#       component_name (required)
#         Name of the component.
#
#       main_dart (required)
#         File containing the main function of the component.
#
#       dart_package_name (optional)
#         Name of the dart package for the component. If not provided, it will
#         be inferred from the component name.
#
#       package_root (optional)
#         Path to the dart package for the component. If not provided, it will
#         be assumed as ".".
#
#       sources (optional)
#         Relative path of source files to be included in the dart package for
#         the component at $package_root/lib.
#
template("flutter_dart_apps") {
  assert(defined(invoker.components) && !defined(invoker.main_dart),
         "components must be defined. Use main_dart under components instead.")

  pkg_name = target_name
  legacy_component = false
  if (flutter_default_app == "flutter_jit_app") {
    template_name = "flutter_dart_jit_component"
    if (dart_force_product) {
      template_name = flutter_product_app
    }
    target(template_name, target_name) {
      forward_variables_from(invoker, "*", [ "aot" ])
    }
  } else {
    template_name = "flutter_dart_aot_component"
    if (dart_force_product) {
      template_name = flutter_product_app
    }
    target(template_name, target_name) {
      forward_variables_from(invoker,
                             "*",
                             [
                               "aot",
                               "space_dart",
                             ])
    }
  }
}
