# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

assert(is_fuchsia)

import("//build/fuchsia/sdk.gni")
import("//flutter/common/config.gni")
import("//flutter/testing/testing.gni")
import("//flutter/tools/fuchsia/dart.gni")
import("//flutter/tools/fuchsia/fuchsia_host_bundle.gni")

product_suffix = ""

if (flutter_runtime_mode == "release") {
  product_suffix = "product_"
}

fuchsia_host_bundle("flutter_binaries") {
  name = "flutter_binaries"

  _flutter_tester_label = "//flutter/shell/testing:testing($host_toolchain)"

  deps = [ _flutter_tester_label ]

  _flutter_tester_bin_path =
      rebase_path(get_label_info(_flutter_tester_label, "root_out_dir") +
                  "/flutter_tester")

  sources = [ _flutter_tester_bin_path ]
}

fuchsia_host_bundle("dart_binaries") {
  name = "dart_binaries"

  _gen_snapshot_to_use = gen_snapshot + "($host_toolchain)"
  if (flutter_runtime_mode == "release") {
    _gen_snapshot_to_use = gen_snapshot_product + "($host_toolchain)"
  }

  _kernel_compiler_label = "dart:kernel_compiler($host_toolchain)"
  _frontend_server_label =
      "//flutter/flutter_frontend_server:frontend_server($host_toolchain)"
  _list_libraries_label = "dart:list_libraries($host_toolchain)"

  deps = [
    _frontend_server_label,
    _gen_snapshot_to_use,
    _kernel_compiler_label,
    _list_libraries_label,
  ]

  _gen_snapshot_bin_path =
      rebase_path(get_label_info(_gen_snapshot_to_use, "root_out_dir") + "/" +
                  get_label_info(_gen_snapshot_to_use, "name"))

  _kernel_compiler_path =
      rebase_path(get_label_info(_kernel_compiler_label, "root_gen_dir") +
                  "/kernel_compiler.dart.snapshot")

  _frontend_server_path =
      rebase_path(get_label_info(_frontend_server_label, "root_gen_dir") +
                  "/frontend_server.dart.snapshot")

  _list_libraries_path =
      rebase_path(get_label_info(_list_libraries_label, "root_gen_dir") +
                  "/list_libraries.dart.snapshot")

  sources = [
    _frontend_server_path,
    _gen_snapshot_bin_path,
    _kernel_compiler_path,
    _list_libraries_path,
  ]
}

group("fuchsia") {
  deps = [
    ":dart_binaries",
    ":flutter_binaries",
    "dart_runner:dart_aot_${product_suffix}runner",
    "dart_runner:dart_jit_${product_suffix}runner",
    "flutter:flutter_aot_${product_suffix}runner",
    "flutter:flutter_jit_${product_suffix}runner",
  ]
}

if (enable_unittests) {
  group("tests") {
    testonly = true

    deps = [ "flutter:tests" ]
  }
}
