# Copyright 2019 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("//topaz/runtime/flutter_runner/flutter_app.gni")

template("settings_app") {
  config = invoker.config

  base_sources = [
    "src/models/settings_model.dart",
    "src/setting_entry.dart",
    "src/widgets/all_settings.dart",
  ]

  if (defined(invoker.additional_sources)) {
    base_sources += invoker.additional_sources
  }

  base_resources = [
    {
      path = rebase_path(config)
      dest = "settings.config"
    },
  ]

  base_deps = [
    "//sdk/fidl/fuchsia.deprecatedtimezone",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/fidl/fuchsia.wlan.service",
    "//src/experiences/settings/lib/settings",
    "//src/experiences/settings/lib/widgets",
    "//third_party/dart-pkg/git/flutter/packages/flutter",
    "//third_party/dart-pkg/git/flutter/packages/flutter_test",
    "//third_party/dart-pkg/pub/meta",
    "//topaz/public/dart/fuchsia_logger",
    "//topaz/public/dart/fuchsia_scenic_flutter",
    "//topaz/public/dart/fuchsia_services",
  ]

  if (defined(invoker.additional_deps)) {
    base_deps += invoker.additional_deps
  }

  base_meta = [
    {
      path = "//src/experiences/settings/bin/meta/settings.cmx"
      dest = "settings.cmx"
    },
  ]

  # We cannot define the flutter app as a component for the base/canonical
  # target as tests target the dart library, which is only generated correctly
  # when not defined as a component.
  if (defined(invoker.extended) && invoker.extended) {
    flutter_app(target_name) {
      components = [
        {
          component_name = "settings"
          component_type = "flutter"
          package_root = "//src/experiences/settings/bin"
          main_dart = "//src/experiences/settings/bin/lib/main.dart"
          sources = base_sources
          deps = base_deps
        },
      ]
      manifest = "//src/experiences/settings/bin/pubspec.yaml"

      meta = base_meta

      resources = base_resources
    }
  } else {
    flutter_app(target_name) {
      main_dart = "lib/main.dart"

      package_name = "settings"

      manifest = "pubspec.yaml"

      meta = base_meta

      sources = base_sources

      resources = base_resources

      deps = base_deps
    }
  }
}

# Defines a Flutter app target for the Settings app.
#
# This template allows products to have custom settings app by
# specifying a unique settings.config file specifying the options
# shown. It is important extended_settings_app is used and not settings_app,
# which is reserved for the topaz copy for generating the proper test artifacts.
#
# config (required)
#   The file name of the settings configuration file defining what
#   will be shown. see //topaz/bin/settings/settings.config as an
#   example. The file should exist at the same root folder as
#   template usage.
#
template("extended_settings_app") {
  extended = true
  settings_app(target_name) {
    forward_variables_from(invoker, "*")
  }
}
