# Copyright 2016 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/package.gni")
import("//build/testing/environments.gni")
import("//peridot/build/executable_package.gni")
import("//peridot/build/tests_package.gni")
import("//third_party/flatbuffers/flatbuffer.gni")

declare_args() {
  # Whether basemgr should automatically login as a persistent guest user.
  auto_login_to_guest = false

  # Whether basemgr and dev_base_shell should use account_manager for account
  # creation. This is a temporary flag while modular transitions to use account
  # manager.
  use_account_manager = false
}

flatbuffer("users") {
  sources = [
    "users.fbs",
  ]
}

executable_package("basemgr") {
  deprecated_global_persistent_storage = "//build"
  meta = [
    {
      path = "meta/basemgr.cmx"
      dest = "basemgr.cmx"
    },
  ]

  sources = [
    "basemgr_impl.cc",
    "basemgr_impl.h",
    "basemgr_settings.cc",
    "basemgr_settings.h",
    "main.cc",
  ]

  deps = [
    ":lib",
    ":wait_for_minfs",
    "//garnet/public/lib/component/cpp",
    "//garnet/public/lib/fxl",
    "//garnet/public/lib/json",
    "//peridot/bin/basemgr/cobalt",
    "//peridot/bin/basemgr/session_shell_settings",
    "//peridot/lib/common:async_holder",
    "//peridot/lib/common:teardown",
    "//peridot/lib/fidl:app_client",
    "//peridot/lib/fidl:array_to_string",
    "//peridot/lib/fidl:clone",
    "//peridot/lib/fidl:environment",
    "//peridot/lib/ledger_client:constants",
    "//peridot/lib/modular_config:modular_config",
    "//peridot/public/lib/async/cpp:future",
    "//sdk/fidl/fuchsia.auth",
    "//sdk/fidl/fuchsia.auth.account",
    "//sdk/fidl/fuchsia.devicesettings",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.auth",
    "//sdk/fidl/fuchsia.modular.internal",
    "//sdk/fidl/fuchsia.modular.session",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.ui.app",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/fidl/fuchsia.wlan.service",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fxl",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/trace-provider",
  ]

  public_deps = [
    "//peridot/bin/basemgr/cobalt:basemgr_metrics_registry",
  ]

  resources = [
    {
      path = rebase_path(
              get_label_info(
                  "//peridot/bin/basemgr/cobalt:basemgr_metrics_registry",
                  "target_gen_dir") + "/basemgr_metrics_registry.pb")
      dest = "basemgr_metrics_registry.pb"
    },
  ]
}

tests_package("basemgr_unittests") {
  deps = [
    ":session_context_impl_unittest",
    "//peridot/bin/basemgr/session_shell_settings:session_shell_settings_unittest",
  ]
  environments = basic_envs
}

source_set("wait_for_minfs") {
  sources = [
    "wait_for_minfs.cc",
    "wait_for_minfs.h",
  ]

  public_deps = [
    "//garnet/public/lib/fsl",
    "//src/lib/fxl",
  ]
}

source_set("lib") {
  sources = [
    "presentation_container.cc",
    "presentation_container.h",
    "session_context_impl.cc",
    "session_context_impl.h",
    "session_provider.cc",
    "session_provider.h",
    "session_user_provider_impl.cc",
    "session_user_provider_impl.h",
    "user_provider_impl.cc",
    "user_provider_impl.h",
  ]

  deps = [
    ":users",
    "//garnet/public/lib/component/cpp",
    "//garnet/public/lib/fsl",
    "//peridot/bin/basemgr/session_shell_settings",
    "//peridot/lib/common:async_holder",
    "//peridot/lib/common:teardown",
    "//peridot/lib/fidl:app_client",
    "//peridot/lib/fidl:array_to_string",
    "//peridot/lib/fidl:clone",
    "//peridot/lib/fidl:environment",
    "//peridot/lib/fidl:json_xdr",
    "//peridot/lib/modular_config",
    "//peridot/public/lib/async/cpp:future",
    "//sdk/fidl/fuchsia.modular.session",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.ui.gfx",
    "//sdk/fidl/fuchsia.ui.input",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fxl",
    "//zircon/public/lib/trace",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.auth",
    "//sdk/fidl/fuchsia.auth.account",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.auth",
    "//sdk/fidl/fuchsia.modular.internal",
  ]

  if (auto_login_to_guest && use_account_manager) {
    public_configs = [
      ":auto_login_to_guest",
      ":use_account_manager",
    ]
  } else if (auto_login_to_guest) {
    public_configs = [ ":auto_login_to_guest" ]
  } else if (use_account_manager) {
    public_configs = [ ":use_account_manager" ]
  }
}

executable_package("dev_base_shell") {
  meta = [
    {
      path = "meta/dev_base_shell.cmx"
      dest = "dev_base_shell.cmx"
    },
  ]

  deps = [
    ":dev_base_shell_source_set",
  ]
}

source_set("dev_base_shell_source_set") {
  sources = [
    "dev_base_shell.cc",
  ]

  deps = [
    "//garnet/public/lib/callback",
    "//peridot/lib/fidl:single_service_app",
    "//peridot/public/lib/app_driver/cpp",
    "//peridot/public/lib/integration_testing/cpp",
    "//sdk/fidl/fuchsia.auth.account",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.ui.viewsv1token",
    "//src/lib/fxl",
    "//zircon/public/lib/async-loop-cpp",
  ]

  if (use_account_manager) {
    public_configs = [ ":use_account_manager" ]
  }
}

executable("session_context_impl_unittest") {
  testonly = true

  sources = [
    "session_context_impl_unittest.cc",
  ]

  deps = [
    ":lib",
    "//garnet/public/lib/component/cpp",
    "//garnet/public/lib/component/cpp/testing:fake_launcher",
    "//garnet/public/lib/fsl",
    "//garnet/public/lib/gtest",
    "//peridot/lib/fidl:clone",
    "//src/lib/fxl",
    "//third_party/googletest:gtest_main",
  ]
}

config("auto_login_to_guest") {
  defines = [ "AUTO_LOGIN_TO_GUEST" ]
}

config("use_account_manager") {
  defines = [ "USE_ACCOUNT_MANAGER" ]
}
