# 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 = true
}

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

executable_package("basemgr") {
  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" ]
}
