# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/ios/ios_sdk.gni")

# Template to compile an .intentdefinition file.
#
# Arguments
#
#   intent_file
#     path to .intentdefinition file that must be compiled
#
#   intent_names
#     list of string corresponding to the intent defined in intent_file;
#     must include all the intents as only the intents listed will be
#     compiled
#
#   developer_dir
#     (optional) path to developer_dir to use
#
template("intent_definition") {
  assert(defined(invoker.intent_file) && invoker.intent_file != "",
         "intent_file must be defined for $target_name")

  assert(defined(invoker.intent_names) && invoker.intent_names != [],
         "intent_names must be defined for $target_name")

  assert(xcode_version_int >= 1140,
         "intent_definition requires Xcode 11.4 or higher")

  _compile_intent_target = "${target_name}_compile_intent"
  _compile_intent_output =
      "$target_gen_dir/" + get_path_info(invoker.intent_file, "file")

  action(_compile_intent_target) {
    script = "//build/apple/xcrun.py"
    inputs = [ invoker.intent_file ]
    outputs = [ _compile_intent_output ]
    args = [
      "intentbuilderc",
      "compile",
      "-input",
      rebase_path(invoker.intent_file, root_build_dir),
      "-output",
      rebase_path(target_gen_dir, root_build_dir),
    ]

    if (defined(invoker.developer_dir)) {
      args += [
        "--developer-dir",
        rebase_path(invoker.developer_dir, root_build_dir),
      ]
    }
  }

  _compile_intent_bundle = "${target_name}_compile_intent_bundle"
  bundle_data(_compile_intent_bundle) {
    sources = [ _compile_intent_output ]
    outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
    public_deps = [ ":$_compile_intent_target" ]
  }

  _generate_source_target = "${target_name}_generate_source"
  _generate_source_output = []
  foreach(_intent, invoker.intent_names) {
    _generate_source_output += [
      "$target_gen_dir/$_intent.h",
      "$target_gen_dir/$_intent.m",
    ]
  }

  action(_generate_source_target) {
    script = "//build/apple/xcrun.py"
    inputs = [ invoker.intent_file ]
    outputs = _generate_source_output
    args = [
      "intentbuilderc",
      "generate",
      "-input",
      rebase_path(invoker.intent_file, root_build_dir),
      "-output",
      rebase_path(target_gen_dir, root_build_dir),
      "-language",
      "Objective-C",
    ]

    if (defined(invoker.developer_dir)) {
      args += [
        "--developer-dir",
        rebase_path(invoker.developer_dir, root_build_dir),
      ]
    }
  }

  source_set(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "developer_dir",
                             "intent_file",
                             "intent_names",
                             "sources",
                           ])

    if (!defined(deps)) {
      deps = []
    }
    if (!defined(frameworks)) {
      frameworks = []
    }

    sources = _generate_source_output
    configs += [ "//build/config/compiler:enable_arc" ]
    deps += [
      ":$_compile_intent_bundle",
      ":$_generate_source_target",
    ]
    frameworks += [ "Intents.framework" ]
  }
}
