# 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/test/test_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
}

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/agents/clipboard:clipboard_sources",
    "//peridot/bin/basemgr/cobalt",
    "//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/ledger_client:page_client",
    "//peridot/lib/modular_config:modular_config",
    "//peridot/lib/rapidjson",
    "//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.setui",
    "//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/sys/cpp",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fxl",
    "//zircon/public/fidl/fuchsia-device-manager",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/trace-provider-with-fdio",
  ]

  resources = [
    {
      path = rebase_path("//third_party/icu/common/icudtl.dat")
      dest = "icudtl.dat"
    },
  ]
}

hermetic_tests_package("basemgr_unittests") {
  deps = [
    ":session_context_impl_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 = [
    "noop_clipboard_impl.h",
    "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",
  ]

  deps = [
    "//garnet/public/lib/fsl",
    "//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/sys/cpp",
    "//src/lib/fxl",
    "//zircon/public/fidl/fuchsia-device-manager",
    "//zircon/public/lib/trace",
  ]

  public_deps = [
    "//peridot/bin/basemgr/intl_property_provider_impl",
    "//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) {
    public_configs = [ ":auto_login_to_guest" ]
  }
}

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

  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.views",
    "//src/lib/fxl",
    "//zircon/public/lib/async-loop-cpp",
  ]
}

executable("auto_login_base_shell_bin") {
  output_name = "auto_login_base_shell"

  sources = [
    "auto_login_base_shell.cc",
  ]

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

package("auto_login_base_shell") {
  deps = [
    ":auto_login_base_shell_bin",
  ]

  binaries = [
    {
      name = "auto_login_base_shell"
    },
  ]

  meta = [
    {
      path = "meta/auto_login_base_shell.cmx"
      dest = "auto_login_base_shell.cmx"
    },
  ]
}

executable("auto_login_base_shell_test_bin") {
  testonly = true

  output_name = "auto_login_base_shell_test"

  sources = [
    "auto_login_base_shell_test.cc",
  ]

  deps = [
    "//peridot/public/lib/modular_test_harness/cpp:test_harness_fixture",
    "//sdk/fidl/fuchsia.modular.testing",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:integration",
    "//src/lib/fxl/test:gtest_main",
  ]
}

test_package("auto_login_base_shell_test") {
  deps = [
    ":auto_login_base_shell_bin",
    ":auto_login_base_shell_test_bin",
  ]

  tests = [
    {
      name = "auto_login_base_shell_test"
      environments = basic_envs
    },
  ]
}

executable("session_context_impl_unittest") {
  testonly = true

  sources = [
    "session_context_impl_unittest.cc",
  ]

  deps = [
    ":lib",
    "//garnet/public/lib/fsl",
    "//garnet/public/lib/gtest",
    "//peridot/lib/fidl:clone",
    "//peridot/lib/fidl:environment",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:unit",
    "//src/lib/fxl",
    "//src/lib/fxl/test:gtest_main",
  ]
}

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