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

# Currently paths here are hard coded for convenience in building Mojo/Flutter.
declare_args() {
  # Specify the path to a host compatible version of the Dart SDK.
  # This SDK is used to compile the Observatory frontend sources.
  dart_host_sdk = rebase_path("//third_party/dart-sdk/dart-sdk")

  # Specify the path to a host compatible version of pub.
  # This is used to compile the Observatory frontend sources.
  #
  # The observatory build tool searches for pub first using this GN arg, then
  # for the checked-in SDK, and if that doesn't work, it uses the dart_bootstrap
  # built as part of the build to invoke pub. If this arg is set to a non-empty
  # string, we assume that there is no need for dart_bootstrap. If it is set to
  # "", then we assume that there may be a need for dart_bootstrap.
  dart_host_pub_exe = rebase_path("$dart_host_sdk/bin/pub")
}

# Construct arguments to the observatory tool for finding pub.
pub_build_deps = []
pub_build_args = []
if (dart_host_pub_exe != "") {
  pub_build_args = [
    "--pub-executable",
    dart_host_pub_exe,
  ]
} else if (!prebuilt_dart_exe_works) {
  pub_build_deps += [ "../bin:dart_bootstrap($host_toolchain)" ]

  dart_out_dir =
      get_label_info("../bin:dart_bootstrap($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"),
  ]
}
