# 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("//build/components.gni")
import("//build/dart/dart_component.gni")
import("//build/dart/dart_library.gni")

dart_library("lib") {
  package_name = "workstation_session"
  source_dir = "lib"
  null_safe = true
  sources = [ "main.dart" ]
  deps = [
    "//sdk/dart/fidl",
    "//sdk/dart/fuchsia",
    "//sdk/dart/fuchsia_logger",
    "//sdk/dart/fuchsia_services",
    "//sdk/dart/fuchsia_vfs",
    "//sdk/dart/zircon",
    "//sdk/fidl/fuchsia.component:fuchsia.component_dart",
    "//sdk/fidl/fuchsia.component.decl:fuchsia.component.decl_dart",
    "//sdk/fidl/fuchsia.io:fuchsia.io_dart",
    "//sdk/fidl/fuchsia.session.scene:fuchsia.session.scene_dart",
    "//sdk/fidl/fuchsia.ui.app:fuchsia.ui.app_dart",
    "//sdk/fidl/fuchsia.ui.input:fuchsia.ui.input_dart",
    "//sdk/fidl/fuchsia.ui.views:fuchsia.ui.views_dart",
  ]
}

dart_component("session_component") {
  component_name = "workstation_session"
  manifest = "meta/workstation_session.cml"
  deps = [ ":lib" ]
}

fuchsia_component("workstation_routing") {
  assert(
      dart_default_build_cfg.is_aot == flutter_default_build_cfg.is_aot &&
          dart_default_build_cfg.is_product ==
              flutter_default_build_cfg.is_product,
      "workstation_routing requires dart and flutter runtimes use the same build configuration. Make sure 'fx set ... --args=(dart|flutter)_force_product=<bool>' flags are omitted, or match, for both dart and flutter.")
  if (!dart_default_build_cfg.is_aot && !dart_default_build_cfg.is_product) {
    manifest = "meta/workstation_routing_jit.cml"
  } else if (!dart_default_build_cfg.is_aot &&
             dart_default_build_cfg.is_product) {
    manifest = "meta/workstation_routing_jit_product.cml"
  } else if (dart_default_build_cfg.is_aot &&
             !dart_default_build_cfg.is_product) {
    manifest = "meta/workstation_routing_aot.cml"
  } else if (dart_default_build_cfg.is_aot &&
             dart_default_build_cfg.is_product) {
    manifest = "meta/workstation_routing_aot_product.cml"
  }
}

fuchsia_package("workstation_session_pkg") {
  package_name = "workstation_session"
  deps = [
    ":session_component",
    ":workstation_routing",
  ]
}

group("session") {
  public_deps = [ ":workstation_session_pkg" ]
}
