# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# TODO(fxb/58062): Delete this file after all packages are migrated away from
# flutter_app.
import("//build/dart/dart_library.gni")
import("//build/flutter/flutter_build_config.gni")
import("//build/flutter/flutter_component.gni")
import("//src/sys/build/components.gni")

# Defines a Flutter application
#
# Parameters
#
#   main_dart (required)
#     Name of the Dart file containing the main function.
#
#   meta (required)
#     A list containing 1 scope with the path to the cmx file associated with
#     the flutter app.
#
#   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)
#     Always "pubspec.yaml".
#
#   product (optional)
#     A boolean. Whether to build/run the app in a stripped-down Dart VM.
#     Defaults to !is_debug.
#
#   resources (optional)
#     An optional list of resources.
#
#   deps (optional)
#     List of labels for Dart libraries this library depends on.
#
#   TODO(fxb/63133): non_dart_deps is deprecated. Use deps instead.
#   non_dart_deps (optional, deprecated)
#     List of labels this library depends on that are not Dart libraries. This
#     includes things like actions that generate Dart code. It typically doesn't
#     need to be set.
#     Note that these labels *must* have an explicit toolchain attached.
template("flutter_app") {
  assert(defined(invoker.main_dart), "Must define main_dart")
  assert(defined(invoker.meta), "Must define meta")
  _invoker_meta = invoker.meta
  assert(_invoker_meta != [] && _invoker_meta == [ _invoker_meta[0] ],
         "meta must have exactly 1 element!")
  _meta = _invoker_meta[0]
  assert(defined(_meta.path), "Must define meta[0].path")
  if (defined(invoker.manifest)) {
    assert(invoker.manifest == "pubspec.yaml",
           "manifest can only be pubspec.yaml")
  }
  _package_name = target_name
  if (defined(invoker.package_name)) {
    _package_name = invoker.package_name
  }
  _fuchsia_package_name = target_name
  if (defined(invoker.fuchsia_package_name)) {
    _fuchsia_package_name = invoker.fuchsia_package_name
  }
  _split_main_dart = string_split(invoker.main_dart, "lib/")
  if (_split_main_dart[0] == "") {
    _main_dart = string_replace(invoker.main_dart, "lib/", "", 1)
    _source_dir = "lib"
  } else {
    _main_dart = invoker.main_dart
    _source_dir = "."
  }
  _sources = [ _main_dart ]
  if (defined(invoker.sources)) {
    _sources += invoker.sources
  }
  _build_cfg = flutter_default_build_cfg
  if (defined(invoker.product) && invoker.product) {
    _build_cfg = flutter_release_build_cfg
  }
  _deps = []
  if (defined(invoker.deps)) {
    _deps += invoker.deps
  }
  if (defined(invoker.non_dart_deps)) {
    _deps += invoker.non_dart_deps
  }

  resource_gn_labels = []
  if (defined(invoker.resources)) {
    i = 0
    foreach(res, invoker.resources) {
      current_gn_label = target_name + "_resource_" + i
      resource(current_gn_label) {
        sources = [ res.path ]
        outputs = [ "data/" + res.dest ]
      }
      resource_gn_labels += [ ":$current_gn_label" ]
      i += 1
    }
  }

  dart_library_gn_label = target_name + "_dart_library"
  dart_library(dart_library_gn_label) {
    package_name = _package_name
    sources = _sources
    source_dir = _source_dir
    deps = _deps + resource_gn_labels
  }

  flutter_component_gn_label = target_name + "_flutter_component"
  flutter_component(flutter_component_gn_label) {
    main_package = _package_name
    component_name = string_replace(_fuchsia_package_name, "_", "-")
    main_dart = _main_dart
    manifest = _meta.path
    deps = [ ":$dart_library_gn_label" ]
    build_cfg = _build_cfg
  }

  fuchsia_package_gn_label = string_replace(target_name, "_", "-")
  fuchsia_package(fuchsia_package_gn_label) {
    package_name = string_replace(_fuchsia_package_name, "_", "-")
    deps = [
      ":$flutter_component_gn_label",
      "//build/flutter:deprecated_flutter_app_allowlist",
    ]
  }

  # @TODO(fxb/62741): For purposes of soft transition.
  if (target_name != fuchsia_package_gn_label) {
    group(target_name) {
      deps = [ ":$fuchsia_package_gn_label" ]
    }
  }
}
