# 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("//src/modular/build/executable_package.gni")
import("//src/modular/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",
    "main.cc",
  ]

  deps = [
    ":lib",
    ":wait_for_minfs",
    "//garnet/public/lib/json",
    "//sdk/fidl/fuchsia.auth",
    "//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.lifecycle",
    "//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/fsl",
    "//src/lib/syslog/cpp",
    "//src/modular/bin/basemgr/cobalt",
    "//src/modular/lib/async/cpp:future",
    "//src/modular/lib/async/cpp:future",
    "//src/modular/lib/common:async_holder",
    "//src/modular/lib/common:teardown",
    "//src/modular/lib/fidl:app_client",
    "//src/modular/lib/fidl:clone",
    "//src/modular/lib/fidl:environment",
    "//src/modular/lib/lifecycle/cpp",
    "//src/modular/lib/modular_config",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
    "//zircon/public/lib/trace-provider-with-fdio",
    "//zircon/public/lib/zxtest",
    "//zircon/system/fidl/fuchsia-device-manager",
  ]

  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 = [ "//src/lib/fsl" ]

  deps = [
    "//src/lib/syslog/cpp",
    "//zircon/system/ulib/fdio-caller",
  ]
}

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",
  ]

  deps = [
    "//sdk/fidl/fuchsia.modular.session",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.ui.input",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/sys/cpp",
    "//src/lib/fsl",
    "//src/modular/bin/basemgr/cobalt",
    "//src/modular/lib/async/cpp:future",
    "//src/modular/lib/common:async_holder",
    "//src/modular/lib/common:teardown",
    "//src/modular/lib/fidl:app_client",
    "//src/modular/lib/fidl:clone",
    "//src/modular/lib/fidl:environment",
    "//src/modular/lib/modular_config",
    "//src/modular/lib/pseudo_dir:pseudo_dir_utils",
    "//zircon/system/fidl/fuchsia-device-manager",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.auth",
    "//sdk/fidl/fuchsia.identity.account",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.auth",
    "//sdk/fidl/fuchsia.modular.internal",
    "//src/lib/intl/intl_property_provider_impl",
  ]

  public_configs = [ "//build/config:Wno-reorder-init-list" ]

  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 = [
    "//sdk/fidl/fuchsia.identity.account",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.ui.views",
    "//src/lib/callback",
    "//src/modular/lib/app_driver/cpp",
    "//src/modular/lib/fidl:single_service_app",
    "//src/modular/lib/integration_testing/cpp",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/async-loop-default",
  ]
}

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

  sources = [ "auto_login_base_shell.cc" ]

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

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 = [
    "//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",
    "//src/modular/lib/modular_test_harness/cpp:test_harness_fixture",
  ]
}

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/gtest",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:unit",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fsl",
    "//src/lib/fxl/test:gtest_main",
    "//src/modular/lib/fidl:clone",
    "//src/modular/lib/fidl:environment",
  ]
}

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