# Copyright 2019 The Chromium 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/ios/bundle_identifier_prefix.gni")
import("//build/config/ios/sdk_info.gni")
import("//build/config/ios/templates/ios_binary_bundle.gni")
import("//build/config/ios/templates/merge_plist.gni")

# Template to generate an app bundle.
#
# All the other parameters are forwarded to a shared_library target that will
# generate the bundle binary. In general, you want to pass at least "sources"
# or "deps" to have some binary objects included in your shared library.
#
# Arguments
#
#   - info_plist (optional)
#
#       path to additional Info.plist to merge into the final bundle Info.plist
#
#   - bundle_identifier_prefix (optional)
#
#       prefix for the bundle identifier (the full identifier will be defined
#       to $bundle_identifier_prefix.$output_name); if unset will defaults to
#       default_bundle_identifier_prefix
#
#   - output_name (optional)
#
#       name of the bundle without the extension; defaults to $target_name
#
template("ios_app_bundle") {
  _output_name = target_name
  if (defined(invoker.output_name)) {
    _output_name = invoker.output_name
  }

  _bundle_identifier_prefix = default_bundle_identifier_prefix
  if (defined(invoker.bundle_identifier_prefix)) {
    _bundle_identifier_prefix = invoker.bundle_identifier_prefix
  }

  _bundle_identifier = "$_bundle_identifier_prefix.$_output_name"

  _app_prefix_target = target_name + "_app_prefix"
  _app_prefix_output = "$target_out_dir/$_app_prefix_target/app_prefix.json"

  action(_app_prefix_target) {
    script = "//build/config/ios/scripts/find_app_identifier_prefix.py"
    sources = []
    outputs = [
      _app_prefix_output,
    ]
    args = [
      "-b=" + _bundle_identifier,
      "-o=" + rebase_path(_app_prefix_output, root_build_dir),
    ]
  }

  if (sdk_info.is_simulator) {
    _simu_xcent_target = target_name + "_simu_xcent"
    _simu_xcent_output =
        "$target_out_dir/$_simu_xcent_target/" + "Entitlements-Simulated.plist"

    merge_plist(_simu_xcent_target) {
      format = "xml1"
      output = _simu_xcent_output
      plists = [ "//build/config/ios/resources/Entitlements-Simulated.plist" ]
      substitutions_json = _app_prefix_output
      deps = [
        ":$_app_prefix_target",
      ]
    }
  }

  _executable_target = target_name + "_executable"
  _executable_bundle = target_name + "_executable_bundle"

  executable(_executable_target) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "bundle_extension",
                             "bundle_identifier_prefix",
                             "bundle_type",
                             "display_name",
                             "info_plist",
                             "output_name",
                             "public_headers",
                           ])

    output_extension = ""
    output_name = _output_name
    output_prefix_override = true
    output_dir = "$target_out_dir/$_executable_target"

    if (sdk_info.is_simulator) {
      if (!defined(deps)) {
        deps = []
      }
      if (!defined(inputs)) {
        inputs = []
      }
      if (!defined(ldflags)) {
        ldflags = []
      }

      deps += [ ":$_simu_xcent_target" ]
      inputs += [ _simu_xcent_output ]
      ldflags += [
        "-Xlinker",
        "-sectcreate",
        "-Xlinker",
        "__TEXT",
        "-Xlinker",
        "__entitlements",
        "-Xlinker",
        rebase_path(_simu_xcent_output, root_build_dir),
      ]
    }
  }

  bundle_data(_executable_bundle) {
    public_deps = [
      ":$_executable_target",
    ]
    sources = [
      "$target_out_dir/$_executable_target/$_output_name",
    ]
    outputs = [
      "{{bundle_executable_dir}}/{{source_file_part}}",
    ]
  }

  ios_binary_bundle(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "bundle_extension",
                             "bundle_identifier_prefix",
                             "bundle_type",
                             "deps",
                             "output_name",
                             "public_deps",
                             "public_headers",
                           ])

    output_name = _output_name
    product_type = "com.apple.product-type.application"

    bundle_identifier = _bundle_identifier
    bundle_extension = "app"
    bundle_type = "AAPL"

    public_deps = [
      ":$_executable_bundle",
    ]
  }
}
