# Copyright 2020 The Fuchsia 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.gni")
import("//build/python/python_binary.gni")
import("//build/sdk/sdk_atom.gni")

kernel_snapshot = "//prebuilt/third_party/dart/$host_os-$host_cpu/bin/snapshots/gen_kernel.dart.snapshot"

# TODO(alainv): Move that to dart_tool.gni to make it more generic.
sdk_atom("kernel_compiler_sdk") {
  id = "sdk://tools/dart_kernel_compiler"
  category = "partner"

  meta = {
    schema = "host_tool"
    dest = "tools/dart_kernel_compiler-meta.json"
    value = {
      type = "host_tool"
      name = "dart_kernel_compiler"
      root = "tools"
      files = [
        "tools/dart",
        "tools/dart_prebuilts/dart_runner/platform_strong.dill",
        "tools/dart_prebuilts/flutter_runner/platform_strong.dill",
        "tools/dart_prebuilts/kernel_compiler.snapshot",
        "tools/dart_prebuilts/frontend_server_tool.snapshot",
      ]
    }
  }

  kernel_compiler_path = kernel_snapshot

  files = [
    {
      source = "$kernel_compiler_path"
      dest = "tools/dart_prebuilts/kernel_compiler.snapshot"
    },
    {
      source = prebuilt_dart
      dest = "tools/dart"
    },
    {
      source = "$root_out_dir/dart_runner_patched_sdk/platform_strong.dill"
      dest = "tools/dart_prebuilts/dart_runner/platform_strong.dill"
    },
    {
      source = "$root_out_dir/flutter_runner_patched_sdk/platform_strong.dill"
      dest = "tools/dart_prebuilts/flutter_runner/platform_strong.dill"
    },
    {
      source = rebase_path(
              "//prebuilt/third_party/flutter/${host_cpu}/debug/jit/dart_binaries/flutter_frontend_server.snapshot")
      dest = "tools/dart_prebuilts/frontend_server_tool.snapshot"
    },
  ]

  non_sdk_deps = [
    "//build/dart:platform_files",
    "//build/flutter:platform_files",
  ]
}

sdk_atom("gen_snapshot_sdk") {
  id = "sdk://tools/gen_snapshot"
  category = "partner"

  files_content = [
    "tools/gen_snapshot.${current_cpu}",
    "tools/gen_snapshot_product.${current_cpu}",
  ]

  meta = {
    schema = "host_tool"
    dest = "tools/gen_snapshot-meta.json"
    value = {
      type = "host_tool"
      name = "gen_snapshot"
      root = "tools"
      target_files = {
      }
      if (target_cpu == "arm64") {
        target_files.arm64 = files_content
      } else if (target_cpu == "x64") {
        target_files.x64 = files_content
      } else {
        assert(false, "Unknown CPU type: $target_cpu")
      }
    }
  }

  files = [
    {
      source = prebuilt_gen_snapshot
      dest = "tools/gen_snapshot.${current_cpu}"
    },
    {
      source = prebuilt_gen_snapshot_product
      dest = "tools/gen_snapshot_product.${current_cpu}"
    },
  ]
}

group("tests") {
  testonly = true

  # TODO(fxb/41505): Temporarily disable flutter_tester tests on mac hosts.
  _flutter_tester_tests = []
  if (host_os != "mac") {
    _flutter_tester_tests += [
      "//sdk/dart/fuchsia_internationalization_flutter:tests($host_toolchain)",
      "//sdk/dart/fuchsia_modular:fuchsia_modular_package_unittests($host_toolchain)",
      "//sdk/dart/fuchsia_scenic_flutter:fuchsia_scenic_flutter_unittests($host_toolchain)",
      "//sdk/dart/fuchsia_services:fuchsia_services_package_unittests($host_toolchain)",
      "//sdk/dart/fuchsia_inspect_flutter:inspect_flutter_test($host_toolchain)",
    ]
  }

  public_deps = [
                  # TODO: This target should just aggregate the top-level directories and
                  # most of these dependencies should be in those subdirectories.
                  "//garnet/packages:garnet",
                  "//garnet/packages/testing:run_test_component",
                  "//garnet/packages/tests:scenic",
                  "//garnet/packages/tools:scenic",
                  "//src/modular/bundles:framework",
                  "//src/modular/bundles:tools",
                  "//src/modular/bundles:integration_testing",
                  "//src/fonts",

                  "//sdk/dart/fuchsia_inspect:tests",
                  "//sdk/dart/fuchsia_component_test:tests",

                  # TODO(fxb/38305): Re-enable test when unblocked and inspect paths are corrected
                  # "//sdk/dart/fuchsia_inspect/test/inspect_flutter_integration_tester:inspect-dart-integration-test-driver",
                  "//sdk/dart/fuchsia_inspect/test/inspect_flutter_integration_tester",
                  "//sdk/dart/fuchsia_inspect/test/integration:dart_inspect_vmo_test",
                  "//sdk/dart/fuchsia_inspect/test/integration:dart_inspect_vmo_test_writer",
                  "//sdk/dart/fuchsia_inspect/test/validator_puppet:tests",
                  "//sdk/dart/fuchsia_logger:fuchsia_logger_package_unittests($host_toolchain)",
                  "//sdk/dart/fuchsia_logger/test/integration:fuchsia-logger-integration-tests",
                  "//sdk/dart/fuchsia_modular:fuchsia-modular-integration-tests",
                  "//sdk/dart/fuchsia_modular_testing:fuchsia-modular-testing-integration-tests",
                  "//sdk/dart/fuchsia_services:fuchsia-services-integration-tests",
                  "//sdk/dart/fuchsia_services/test_support:fuchsia-services-foo-test-server",
                  "//sdk/dart/fuchsia_vfs:tests",
                  "//sdk/dart/zircon:tests",
                ] + _flutter_tester_tests
}

_gen_reference_docs_script_target = "gen_reference_docs_script"
python_binary(_gen_reference_docs_script_target) {
  main_source = "//build/dart/gen_reference_docs.py"
  output_name = "gen_reference_docs.pyz"
  deps = [ "//third_party/pyyaml:yaml" ]
}

action("dart_sdk_docs") {
  script_output = get_target_outputs(":${_gen_reference_docs_script_target}")
  script = script_output[0]

  docs_out_dir = "$target_out_dir/docs"

  # We don't know all the generated files ahead of time, but some files are
  # consistent between runs, so list only those.
  outputs = [
    "$docs_out_dir/__404error.md",
    "$docs_out_dir/categories.json",
    "$docs_out_dir/index.json",
    "$docs_out_dir/index.md",
  ]

  args = [
    "--gen-dir",
    rebase_path("$target_gen_dir/docs"),
    "--out-dir",
    rebase_path("$docs_out_dir"),
    "--prebuilts-dir",
    rebase_path("$dart_sdk/bin"),

    # packages
    rebase_path("//sdk/dart/fidl"),
    rebase_path("//sdk/dart/fuchsia"),
    rebase_path("//sdk/dart/fuchsia_component_test"),
    rebase_path("//sdk/dart/fuchsia_inspect"),
    rebase_path("//sdk/dart/fuchsia_inspect_flutter"),
    rebase_path("//sdk/dart/fuchsia_internationalization_flutter"),
    rebase_path("//sdk/dart/fuchsia_logger"),
    rebase_path("//sdk/dart/fuchsia_modular"),
    rebase_path("//sdk/dart/fuchsia_modular_testing"),
    rebase_path("//sdk/dart/fuchsia_scenic"),
    rebase_path("//sdk/dart/fuchsia_scenic_flutter"),
    rebase_path("//sdk/dart/fuchsia_services"),
    rebase_path("//sdk/dart/fuchsia_vfs"),
    rebase_path("//sdk/dart/zircon"),
  ]

  deps = [ ":${_gen_reference_docs_script_target}" ]
}
