# 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/executable_suffix.gni")
import("../../build/prebuilt_dart_sdk.gni")
import("../../build/dart_host_toolchain.gni")
import("observatory_sources.gni")

# Construct arguments to the observatory tool for finding pub.
pub_build_deps = []
pub_build_args = []
if (!prebuilt_dart_exe_works) {
  pub_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")

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

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

# Helper build rules for packaging the Dart observatory resources.
copy("copy_observatory") {
  sources = rebase_path(observatory_sources, "", ".")
  outputs = [
    "$root_gen_dir/observatory_copy/{{source_root_relative_dir}}/{{source_file_part}}",
  ]
}

action("write_observatory_pubspec_yaml") {
  deps = [ ":copy_observatory" ] + pub_build_deps

  inputs = [
    rebase_path("pubspec.yaml"),
  ]

  script = "../../tools/observatory_tool.py"
  args =
      pub_build_args + [
        "--silent=True",
        "--directory",
        rebase_path("$root_gen_dir/observatory_copy/$current_dir/"),
        "--command",
        "rewrite",
        rebase_path("../observatory/pubspec.yaml"),
        rebase_path("$root_gen_dir/observatory_copy/$current_dir/pubspec.yaml"),
        "../../third_party/",
        rebase_path("../../third_party/"),
      ]

  outputs = [
    "$root_gen_dir/observatory_copy/$current_dir/pubspec.yaml",
  ]
}

action("copy_observatory_deps") {
  deps = [ ":write_observatory_pubspec_yaml" ] + pub_build_deps

  inputs = [
    "$root_gen_dir/observatory_copy/$current_dir/pubspec.yaml",
  ]

  script = "../../tools/observatory_tool.py"
  args = pub_build_args + [
           "--silent=True",
           "--stamp",
           rebase_path(
               "$root_gen_dir/observatory_copy/$current_dir/packages.stamp"),
           "--directory",
           rebase_path("$root_gen_dir/observatory_copy/$current_dir/"),
           "--command",
           "get",
         ]

  outputs = [
    "$root_gen_dir/observatory_copy/$current_dir/packages.stamp",
  ]
}

action("pub_build_observatory") {
  deps = [
           ":copy_observatory",
           ":copy_observatory_deps",
         ] + pub_build_deps

  sources = rebase_path(observatory_sources,
                        "",
                        "$root_gen_dir/observatory_copy/$current_dir")

  inputs =
      sources + [ "$root_gen_dir/observatory_copy/$current_dir/packages.stamp" ]

  script = "../../tools/observatory_tool.py"
  args = pub_build_args + [
           "--silent=True",
           "--directory",
           rebase_path("$root_gen_dir/observatory_copy/$current_dir/"),
           "--command",
           "build",
           rebase_path("$root_out_dir/observatory/build"),
         ]

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

action("deploy_observatory") {
  deps = [ ":pub_build_observatory" ] + pub_build_deps

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

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

  args = pub_build_args + [
           "--silent=True",
           "--directory",
           rebase_path("$root_out_dir/observatory"),
           "--command",
           "deploy",
         ]

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