# Copyright 2015 The Chromium 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/dart_host_sdk_toolchain.gni")
import("../../build/executable_suffix.gni")
import("../../build/prebuilt_dart_sdk.gni")
import("observatory_sources.gni")

# Construct arguments to the observatory tool for finding pub.
build_deps = []
build_args = []
if (!prebuilt_dart_exe_works) {
  build_deps += [ "../bin:dart_bootstrap($dart_host_toolchain)" ]

  dart_out_dir = get_label_info("../bin:dart_bootstrap($dart_host_toolchain)",
                                "root_out_dir")
  dart_bootstrap = rebase_path("$dart_out_dir/dart_bootstrap$executable_suffix")

  build_args = [
    "--sdk=True",
    "--dart-executable",
    dart_bootstrap,
  ]
} else {
  build_args = [ "--sdk=True" ]
}

current_dir = rebase_path(".", "//")

action("build_observatory") {
  deps = build_deps

  sources = rebase_path(observatory_sources, "", ".")

  inputs = sources + [ rebase_path("dart2js.packages") ]

  script = "../../tools/observatory_tool.py"
  args = build_args + [
           "--silent=True",
           "--directory",
           rebase_path("."),
           "--command",
           "build",
           rebase_path("web/main.dart"),
           rebase_path("$root_gen_dir/observatory/web/main.dart.js"),
           rebase_path("dart2js.packages"),
         ]

  outputs = [
    "$root_gen_dir/observatory/web/main.dart.js",
  ]
}

action("deploy_observatory") {
  deps = [ ":build_observatory" ] + build_deps

  script = "../../tools/observatory_tool.py"

  inputs = [
    script,
    "$root_gen_dir/observatory/web/main.dart.js",
  ]

  args = build_args + [
           "--silent=True",
           "--directory",
           rebase_path("$root_out_dir/observatory"),
           "--command",
           "deploy",
           rebase_path("$root_out_dir/observatory/deployed"),
           rebase_path("web"),
           rebase_path("lib"),
           rebase_path("$root_gen_dir/observatory/web/main.dart.js"),
           rebase_path("../../third_party/observatory_pub_packages/packages"),
         ]

  outputs = [
    "$root_out_dir/observatory/deployed/web/main.dart.js",
  ]
}

template("observatory_archive") {
  assert(defined(invoker.inner_namespace),
         "Need inner_namespace in $target_name")
  assert(defined(invoker.outer_namespace),
         "Need outer_namespace in $target_name")
  enable_compression = false
  if (defined(invoker.compress) && invoker.compress) {
    enable_compression = true
  }
  action(target_name) {
    deps = [
      ":deploy_observatory",
    ]

    inputs = [
      "$root_out_dir/observatory/deployed/web/main.dart.js",
    ]

    inner_namespace = invoker.inner_namespace
    outer_namespace = invoker.outer_namespace
    output_name = target_name

    script = "../tools/create_archive.py"
    args = [
      "--output",
      rebase_path("$root_gen_dir/observatory/${output_name}.cc"),
      "--tar_output",
      rebase_path("$root_gen_dir/observatory/${output_name}.tar"),
      "--outer_namespace",
      outer_namespace,
      "--inner_namespace",
      inner_namespace,
      "--name",
      "observatory_assets_archive",
      "--client_root",
      rebase_path("$root_out_dir/observatory/deployed/web/"),
    ]
    if (enable_compression) {
      args += [ "--compress" ]
    }

    outputs = [
      "$root_gen_dir/observatory/${output_name}.cc",
      "$root_gen_dir/observatory/${output_name}.tar",
    ]
  }
}

observatory_archive("embedded_archive_observatory") {
  outer_namespace = "dart"
  inner_namespace = "observatory"
}

source_set("embedded_observatory_archive") {
  deps = [
    ":embedded_archive_observatory",
  ]

  sources = [
    rebase_path("$root_gen_dir/observatory/embedded_archive_observatory.cc"),
  ]
}

observatory_archive("standalone_archive_observatory") {
  compress = true
  outer_namespace = "dart"
  inner_namespace = "bin"
}

source_set("standalone_observatory_archive") {
  deps = [
    ":standalone_archive_observatory",
  ]

  sources = [
    rebase_path("$root_gen_dir/observatory/standalone_archive_observatory.cc"),
  ]
}
