# 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.

import("//build/fuchsia/sdk.gni")
import("//flutter/tools/fuchsia/dart/dart_library.gni")
import("//flutter/tools/fuchsia/fidl/fidl.gni")

_fuchsia_sdk_path = "//fuchsia/sdk/$host_os"

template("_fuchsia_dart_library") {
  assert(defined(invoker.meta), "The meta file content must be specified.")
  meta = invoker.meta
  assert(meta.type == "dart_library")

  _output_name = meta.name
  _sources = []
  _deps = []

  if (defined(meta.dart_library_null_safe) && meta.dart_library_null_safe) {
    _dart_language_version = "2.12"
  } else {
    _dart_language_version = "2.0"
  }

  foreach(source, meta.sources) {
    _sources += [ string_replace("$source", "${meta.root}/lib/", "") ]
  }

  foreach(dep, meta.deps) {
    _deps += [ "../dart:$dep" ]
  }

  foreach(dep, meta.fidl_deps) {
    _deps += [ "//flutter/tools/fuchsia/fidl:$dep" ]
  }

  # Compute the third_party deps. The Fuchsia SDK doesn't know where to resolve
  # a third_party dep, and Flutter has third_party Dart libraries in more than
  # one location (some downloaded directly, others as part of the Dart SDK or
  # bundled as a Dart SDK third_party dep). Find a matching library. If a match
  # is required by a build dependency, and a match is not found, you may need to
  # add an entry for it in `flutter/DEPS`.
  known_pkg_paths = [
    "third_party/pkg",
    "third_party/dart/pkg",
    "third_party/dart/third_party/pkg",
  ]

  args = [
    "--ignore-missing",
    "--root",
    rebase_path("//"),
    "--target",
    rebase_path(target_name, "//"),
  ]

  foreach(path, known_pkg_paths) {
    args += [
      "--local-path",
      path,
    ]
  }

  foreach(third_party_dep, meta.third_party_deps) {
    _deps += [ "//flutter/shell/platform/fuchsia/dart:" + third_party_dep.name ]
  }

  dart_library(target_name) {
    package_root = "${_fuchsia_sdk_path}/${meta.root}"
    package_name = _output_name
    language_version = _dart_language_version
    sources = _sources
    deps = _deps
  }
}

template("_fuchsia_fidl_library") {
  assert(defined(invoker.meta), "The meta file content must be specified.")
  meta = invoker.meta
  assert(meta.type == "fidl_library")

  fidl(target_name) {
    sources = []
    foreach(source, meta.sources) {
      sources += [ "$fuchsia_sdk_path/$source" ]
    }
    public_deps = []
    foreach(dep, meta.deps) {
      public_deps += [ ":$dep" ]
    }
  }
}

template("sdk_targets") {
  assert(defined(invoker.meta), "The meta.json file path must be specified.")

  target_type = invoker.target_name

  meta_json = read_file(invoker.meta, "json")

  foreach(part, meta_json.parts) {
    part_meta_json = {
    }

    part_meta = part.meta
    part_meta_rebased = "$fuchsia_sdk_path/$part_meta"

    part_meta_json = read_file(part_meta_rebased, "json")

    if (part_meta != "version_history.json") {
      subtarget_name = part_meta_json.name

      # Check if the part is using `part.element_type` or `part.type`.
      part_type = ""
      if (defined(part.element_type)) {
        part_type = part.element_type
      } else if (defined(part.type)) {
        part_type = part.type
      }

      if (part_type == target_type) {
        if (target_type == "dart_library") {
          _fuchsia_dart_library(subtarget_name) {
            meta = part_meta_json
          }
        } else if (target_type == "fidl_library") {
          _fuchsia_fidl_library(subtarget_name) {
            meta = part_meta_json
          }
        }
      }
    }
  }

  group(target_name) {
  }
}
