# 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")

# 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.
observatory_sources_gypi =
    exec_script("../../tools/gypi_to_gn.py",
                [ rebase_path("../observatory/observatory_sources.gypi") ],
                "scope",
                [ "../observatory/observatory_sources.gypi" ])

copy("copy_observatory") {
  sources = rebase_path(observatory_sources_gypi.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_gypi.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"),
  ]
}
