# Copyright 2018 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/config/fuchsia/platform_version.gni")
import("//build/fidl/fidl_summary.gni")
import("//build/fidl/fidlc.gni")
import("//build/fidl/linting_exceptions.gni")
import("//build/fidl/toolchain.gni")
import("//build/json/validate_json.gni")
import("//build/sdk/sdk_atom.gni")
import("//build/testing/fidl_api_compatibility_test.gni")
import("//build/testing/golden_file.gni")

declare_args() {
  # Whether libraries under //vendor should be linted.
  vendor_linting = false

  # Whether to run API compatibility tests.
  api_compatibility_testing = false
}

# Generates some representation of a FIDL library that's consumable by Language
# bindings generators.
#
# The parameters for this template are defined in //build/fidl/fidl.gni. The
# relevant parameters in this template are:
#   - api;
#   - name;
#   - sdk_category;
#   - sources.
#   - lenient_api_summary
#
#   should_lint (optional, boolean)
#     If set to false, the linting step is skipped.
template("fidl_library") {
  assert(
      current_toolchain == fidl_toolchain,
      "This template can only be used in the FIDL toolchain $fidl_toolchain.")

  assert(defined(invoker.sources), "A FIDL library requires some sources.")

  main_target_name = target_name
  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }

  experimental_flags = []
  if (defined(invoker.experimental_flags)) {
    experimental_flags = invoker.experimental_flags
  }

  summarization_target_name = "${target_name}_api_summarize"
  summarization_target_name_json = "${target_name}_api_summarize_json"

  is_sdk_publishable =
      defined(invoker.sdk_category) && invoker.sdk_category != "internal" &&
      invoker.sdk_category != "experimental" &&
      invoker.sdk_category != "excluded"

  # Additional dependencies to add when this target is published in an SDK.
  sdk_atom_deps = []
  not_needed([ "sdk_atom_deps" ])

  json_representation = "$target_gen_dir/$target_name.fidl.json"
  lint_stamp_file = "$target_gen_dir/$target_name.linted"

  compilation_target_name = "${target_name}_compile"
  verification_target_name = "${target_name}_verify"
  lint_target_name = "${target_name}_lint"

  # Only artifacts that have various associated FIDL generated targets.
  fidl_deps = []

  # Artifacts other than FIDL, that are also dependencies.
  non_fidl_deps = []

  if (defined(invoker.non_fidl_deps)) {
    non_fidl_deps += invoker.non_fidl_deps
  }

  if (defined(invoker.deps)) {
    fidl_deps += invoker.deps - non_fidl_deps
  }
  if (defined(invoker.public_deps)) {
    fidl_deps += invoker.public_deps
  }

  fidlc(compilation_target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "fidl_deps",
                             "json_representation",
                             "library_name",
                             "public_deps",
                             "sources",
                             "testonly",
                           ])
    fidl_target_name = main_target_name
    deps += [ ":$lint_target_name" ] + non_fidl_deps
  }

  action(lint_target_name) {
    visibility = [ ":*" ]

    script = "//build/fidl/run_and_gen_stamp.sh"

    forward_variables_from(invoker,
                           [
                             "sources",
                             "testonly",
                           ])

    # run_and_gen_stamp.sh runs this tool, and touches lint_stamp_file if successful
    tool_with_no_output = "//tools/fidl/fidlc:fidl-lint"

    # Construct the host toolchain version of the tool.
    host_tool = "${tool_with_no_output}($host_toolchain)"

    # Get the path to the executable.
    if (!defined(tool_output_name)) {
      tool_output_name = get_label_info(host_tool, "name")
    }
    tool_out_dir = get_label_info(host_tool, "root_out_dir")
    host_executable = "$tool_out_dir/$tool_output_name"

    deps = [ host_tool ] + non_fidl_deps

    # Add the executable itself as an input.
    inputs = [ host_executable ]

    outputs = [ lint_stamp_file ]

    should_lint = !defined(invoker.should_lint) || invoker.should_lint

    # unlinted_libraries defined in linting_exceptions.gni
    foreach(library, unlinted_libraries) {
      if (library == library_name) {
        should_lint = false
      }
    }

    full_label = get_label_info(":bogus", "label_no_toolchain")
    in_vendor = string_replace(full_label, "//vendor", "") != full_label
    if (in_vendor && !vendor_linting) {
      # Disable lints for libraries under //vendor.
      # TODO(fxbug.dev/36800): remove this exception.
      should_lint = false
    }

    fidl_to_lint = []
    if (should_lint) {
      foreach(source, sources) {
        if (string_replace(source, ".test.", "") == source) {
          # Don't automatically lint test.fidl and test.<various>.fidl files
          fidl_to_lint += [ rebase_path(source, root_build_dir) ]
        }
      }
    }

    args = [ rebase_path(lint_stamp_file, root_build_dir) ]
    if (fidl_to_lint == []) {
      args += [ ":" ]  # NOOP - Nothing to lint, but touch the stamp file
    } else {
      args += [ rebase_path(host_executable, root_build_dir) ]

      excluded_checks = []
      if (defined(invoker.excluded_checks)) {
        excluded_checks = invoker.excluded_checks
      }

      if (excluded_checks != []) {
        # Add path to fidl-lint executable, and --must-find-excluded-checks option, so fidl-lint will
        # return an error if any excluded check is no longer required. Excluded checks are only
        # allowed if the target |fidl_to_lint| files still violate those checks. After updating
        # the FIDL files to resolve a lint error, remove the check-id from the list of excluded
        # checks in the fidl() target to prevent the same lint errors from creeping back in, in
        # the future.
        args += [ "--must-find-excluded-checks" ]

        foreach(excluded_check, excluded_checks) {
          args += [
            "-e",
            excluded_check,
          ]
        }
      }

      args += fidl_to_lint
    }
  }

  summary_file = "${target_gen_dir}/${target_name}.api_summary"
  fidl_summary(summarization_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    inputs = [ json_representation ]
    outputs = [ summary_file ]
    deps = [ ":$compilation_target_name" ]
  }

  # JSON summary file
  summary_file_json = "${summary_file}.json"
  fidl_summary_json(summarization_target_name_json) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    inputs = [ json_representation ]
    outputs = [ summary_file_json ]
    dest = "fidl"
    deps = [ ":$compilation_target_name" ]
    if (is_sdk_publishable) {
      metadata = {
        compatibility_testing_goldens = [
          {
            src = rebase_path(summary_file_json, root_build_dir)
            dst = rebase_path("$library_name.api_summary.json", root_build_dir)
          },
        ]
      }
    }
  }

  # Enforce compatibility checks for all published SDK FIDLs.
  if (is_sdk_publishable) {
    if (api_compatibility_testing) {
      # Test for backward compatibility with the current API level.
      compatibility_test_target_name = "${target_name}_compatibility_test"
      fidl_api_compatibility_test(compatibility_test_target_name) {
        forward_variables_from(invoker,
                               [
                                 "deps",
                                 "sources",
                                 "library_name",
                                 "fidl_deps",
                                 "public_deps",
                                 "experimental_flags",
                                 "testonly",
                               ])
        fidl_target_name = main_target_name
        target_api_level = "HEAD"
        golden_summary_json = "$library_name.api_summary.json"
      }
      sdk_atom_deps += [ ":$compatibility_test_target_name" ]
    } else {
      # A kill switch for API summarization. Set to true to permit compilations
      # that have summary errors.
      lenient_api_summary = false
      if (defined(invoker.lenient_api_summary)) {
        lenient_api_summary = invoker.lenient_api_summary
      }
      verify_api_summary_target_name = "${target_name}_verify_api_summary"
      golden_file(verify_api_summary_target_name) {
        forward_variables_from(invoker, [ "testonly" ])
        warn_on_changes = lenient_api_summary
        golden = "$library_name.api_summary"
        current = "$target_gen_dir/$library_name.api_summary"
        deps = [ ":$summarization_target_name" ]
      }

      # TODO(99710): Add missing goldens for vendor APIs and uncomment.
      # sdk_atom_deps += [ ":$verify_api_summary_target_name" ]
    }
  }

  validate_json(verification_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    data = json_representation
    schema = "//tools/fidl/fidlc/schema.json"
    deps = [ ":$compilation_target_name" ]
  }

  group(main_target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    # Metadata to allow us to query all FIDL IR files.
    metadata = {
      fidl_json = [ rebase_path(json_representation, root_build_dir) ]
      generated_sources = fidl_json
    }

    public_deps = [
      ":$compilation_target_name",
      ":$lint_target_name",
    ]

    deps = [
      ":$verification_target_name",
      ":${summarization_target_name}",
    ]

    # TODO(99710): Delete. See above comment with the same bug number.
    if (defined(verify_api_summary_target_name)) {
      deps += [ ":${verify_api_summary_target_name}" ]
    }
  }

  if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
    sdk_category = invoker.sdk_category
    if (sdk_category == "partner" || sdk_category == "public") {
      api_reference = "$library_name.api"
      if (defined(invoker.api)) {
        api_reference = invoker.api
      }
    }

    # Process sources.
    file_base = "fidl/$library_name"
    all_files = []
    sdk_sources = []
    foreach(source, invoker.sources) {
      relative_source = rebase_path(source, ".")
      if (string_replace(relative_source, "..", "bogus") != relative_source) {
        # If the source file is not within the same directory, just use the file
        # name.
        relative_source = get_path_info(source, "file")
      }
      destination = "$file_base/$relative_source"
      sdk_sources += [ destination ]
      all_files += [
        {
          source = source
          dest = destination
        },
      ]
    }

    # Identify metadata for dependencies.
    sdk_metas = []
    sdk_deps = []
    foreach(dep, fidl_deps) {
      full_label = get_label_info(dep, "label_no_toolchain")
      sdk_dep = "${full_label}_sdk"
      sdk_deps += [ sdk_dep ]
      gen_dir = get_label_info(sdk_dep, "target_gen_dir")
      name = get_label_info(sdk_dep, "name")
      sdk_metas += [ "$gen_dir/$name.meta.json" ]
    }

    # Generate the library metadata.
    meta_file = "$target_gen_dir/${target_name}.sdk_meta.json"
    meta_target_name = "${target_name}_meta"

    action(meta_target_name) {
      script = "//build/fidl/gen_sdk_meta.py"

      inputs = sdk_metas

      outputs = [ meta_file ]

      args = [
        "--out",
        rebase_path(meta_file, root_build_dir),
        "--name",
        library_name,
        "--root",
        file_base,
      ]
      args += [ "--specs" ] + rebase_path(sdk_metas, root_build_dir)
      args += [ "--sources" ] + sdk_sources

      deps = sdk_deps
    }

    api_normalize_target_name = "${target_name}_normalize"
    normalized_file = "$target_gen_dir/${target_name}.normalized"
    to_normalize = []
    foreach(file, all_files) {
      to_normalize += [ file.source ]
    }
    action(api_normalize_target_name) {
      script = "//build/fidl/normalize.py"
      inputs = to_normalize
      outputs = [ normalized_file ]

      args = [
               "--out",
               rebase_path(normalized_file, root_build_dir),
               "--files",
             ] + rebase_path(to_normalize, root_build_dir)
    }

    # Files included in the CTS SDK.
    sdk_atom("${target_name}_cts_sdk") {
      testonly = true
      id = "sdk://cts/$library_name"
      category = "cts"

      files = [
        {
          source = summary_file_json
          dest = string_replace(summary_file_json, "$root_build_dir/", "")
        },
      ]

      meta = {
        dest = "$file_base/cts/meta.json"
        schema = "cts_resource"
        value = {
          type = "resource"
          name = target_name
          resources = []
          foreach(file, files) {
            resources += [ file.dest ]
          }
        }
      }

      non_sdk_deps = [ ":$summarization_target_name_json" ]
    }

    sdk_atom("${target_name}_sdk") {
      id = "sdk://fidl/$library_name"

      category = sdk_category

      if (defined(api_reference)) {
        api = api_reference

        api_contents = [
          {
            source = summary_file
            dest = "fidl/$library_name"
          },
        ]
      }

      meta = {
        source = meta_file
        dest = "$file_base/meta.json"
        schema = "fidl_library"
      }

      files = all_files

      # Metadata to allow us to query all FIDL IR and source files.
      metadata = {
        fidl_json = [ rebase_path(json_representation, root_build_dir) ]
        generated_sources = fidl_json

        # Metadata for FIDL SDK files.
        if (defined(invoker.sdk_category)) {
          sdk_fidl_json_data = [
            {
              name = library_name
              ir = rebase_path(json_representation, root_build_dir)
              category = invoker.sdk_category
            },
          ]
        }
      }

      non_sdk_deps = [
                       ":$api_normalize_target_name",
                       ":$compilation_target_name",
                       ":$meta_target_name",
                       ":$summarization_target_name",
                       ":$summarization_target_name_json",
                     ] + sdk_atom_deps

      deps = []
      foreach(dep, fidl_deps) {
        label = get_label_info(dep, "label_no_toolchain")
        deps += [ "${label}_sdk" ]
      }
    }
  }
}
