# 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/dart_action.gni")
import("observatory_sources.gni")

prebuilt_dart2js_action("build_observatory") {
  script = "web/main.dart"

  # dart2js produces a .deps file, but it is not in a format that is understood
  # by ninja, so we explicitly list all the sources here.
  inputs = [ ".packages" ] + observatory_sources

  output = "$target_gen_dir/observatory/web/main.dart.js"
  outputs = [
    output,
  ]

  version_string = exec_script("../../tools/make_version.py",
                               [
                                 "--quiet",
                                 "--no_git_hash",
                               ],  # Arguments to the script
                               "trim string",  # Input conversions
                               [
                                 "../../tools/VERSION",
                                 "../tools/utils.py",
                               ])  # Dependencies

  args = [
    "--no-preview-dart-2",
    "-DOBS_VER=${version_string}",
    "-o",
    rebase_path(output),
    "--packages=" + rebase_path(".packages"),
    "--minify",
  ]
}

# TODO(zra): Investigate using GN's copy() with set_sources_assignment_filter
# instead of using a python script.
action("deploy_observatory") {
  deps = [
    ":build_observatory",
  ]

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

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

  args = [
    rebase_path("$target_out_dir/observatory/deployed"),
    rebase_path("web"),
    rebase_path("lib"),
    rebase_path("$target_gen_dir/observatory/web/main.dart.js"),
    rebase_path("../../third_party/observatory_pub_packages/packages"),
  ]

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

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

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

    output_name = target_name

    output = "$target_gen_dir/${output_name}.tar"
    outputs = [
      output,
    ]

    script = "../tools/create_archive.py"
    args = [
      "--tar_output",
      rebase_path(output),
      "--client_root",
      rebase_path("$target_out_dir/observatory/deployed/web/"),
    ]
    if (enable_compression) {
      args += [ "--compress" ]
    }
  }
}

observatory_archive("compressed_observatory_archive") {
  compress = true
}

copy("copy_compressed_observatory_archive") {
  archive_target = ":compressed_observatory_archive"
  deps = [
    archive_target,
  ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
  sources = [
    archive_file,
  ]
  outputs = [
    "$root_out_dir/${archive_name}.tar",
  ]
}

observatory_archive("observatory_archive") {
  compress = false
}

copy("copy_observatory_archive") {
  archive_target = ":observatory_archive"
  deps = [
    archive_target,
  ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
  sources = [
    archive_file,
  ]
  outputs = [
    "$root_out_dir/${archive_name}.tar",
  ]
}

# Generates a .cc file containing the bytes of the observatory archive in a C
# array.
#
# Parameters:
#  inner_namespace (required):
#    The inner C++ namespace that the C array lives in.
#
#  outer_namespace (required):
#    The outer C++ namespace that the C array lives in.
#
#  archive_file (required):
#    The path to the observatory archive.
#
template("observatory_archive_source") {
  assert(defined(invoker.inner_namespace),
         "Need inner_namespace in $target_name")
  assert(defined(invoker.outer_namespace),
         "Need outer_namespace in $target_name")
  assert(defined(invoker.archive_file), "Need archive_file in $target_name")

  action(target_name) {
    forward_variables_from(invoker, [ "deps" ])

    inputs = [
      invoker.archive_file,
    ]

    output = "$target_gen_dir/${target_name}.cc"
    outputs = [
      output,
    ]

    script = "../tools/create_archive.py"
    args = [
      "--tar_input",
      rebase_path(invoker.archive_file),
      "--output",
      rebase_path(output),
      "--outer_namespace",
      invoker.outer_namespace,
      "--inner_namespace",
      invoker.inner_namespace,
      "--name",
      "observatory_assets_archive",
    ]
  }
}

observatory_archive_source("embedded_archive_observatory") {
  outer_namespace = "dart"
  inner_namespace = "observatory"

  # TODO(zra): In a Fuchsia build, use a prebuilt Observatory archive.
  archive_target = ":observatory_archive"
  deps = [
    archive_target,
  ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
}

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

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

observatory_archive_source("standalone_archive_observatory") {
  outer_namespace = "dart"
  inner_namespace = "bin"

  # TODO(zra): In a Fuchsia build, use a prebuilt Observatory archive.
  archive_target = ":compressed_observatory_archive"
  deps = [
    archive_target,
  ]
  archive_dir = get_label_info(archive_target, "target_gen_dir")
  archive_name = get_label_info(archive_target, "name")
  archive_file = "${archive_dir}/${archive_name}.tar"
}

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

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