# Copyright 2022 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/config.gni")

# Define a session manager package with a provided configuration file.
#
# Parameters
#
# `config` (required, string): path to a JSON configuration file configuring startup URL.
#
# `package_name` (optional, string): name of the package to create, defaults to `session_manager`.
template("session_manager_package") {
  assert(defined(invoker.config),
         "must define `config` as a path to JSON file with startup config")

  package_name = "session_manager"
  if (defined(invoker.package_name)) {
    package_name = invoker.package_name
  }

  component_target = "${target_name}_component"
  config_target = "${target_name}_config"
  manifest_target = "${target_name}_manifest_compile"

  fuchsia_component_manifest(manifest_target) {
    manifest = "//src/session/bin/session_manager/meta/session_manager.cml"
    restricted_features = [ "structured_config" ]
    component_name = "session_manager"
  }

  fuchsia_component(component_target) {
    cm_label = ":${manifest_target}"
    deps = [ "//src/session/bin/session_manager:bin" ]
  }

  fuchsia_structured_config_values(config_target) {
    cm_label = ":${manifest_target}"
    values_source = invoker.config
  }

  fuchsia_package(target_name) {
    package_name = package_name
    deps = [
      ":${component_target}",
      ":${config_target}",
    ]
  }
}
