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

mac_app_script = "//build/config/mac/mac_app.py"

template("code_sign_mac") {
  assert(defined(invoker.entitlements_path),
         "The path to the entitlements .xcent file")
  assert(defined(invoker.identity),
         "The code signing identity")
  assert(defined(invoker.application_path),
         "The application to code sign")
  assert(defined(invoker.deps))

  action(target_name) {
    sources = [
      invoker.entitlements_path,
    ]

    _application_path = invoker.application_path

    script = mac_app_script

    outputs = [
      "$_application_path/_CodeSignature/CodeResources"
    ]

    args = [
      "codesign",
      "-p",
      rebase_path(invoker.application_path, root_build_dir),
      "-i",
      invoker.identity,
      "-e",
      rebase_path(invoker.entitlements_path, root_build_dir),
    ]

    deps = invoker.deps
  }
}

template("process_nibs_mac") {
  assert(defined(invoker.sources),
         "The nib sources must be specified")
  assert(defined(invoker.module),
         "The nib module must be specified")
  assert(defined(invoker.output_dir),
         "The output directory must be specified")

  action_foreach(target_name) {
    sources = invoker.sources

    script = mac_app_script

    invoker_out_dir = invoker.output_dir

    outputs = [
      "$root_build_dir/$invoker_out_dir/{{source_name_part}}.nib"
    ]

    args = [
      "nib",
      "-i",
      "{{source}}",
      "-o",
      invoker_out_dir,
      "-m",
      invoker.module,
    ]
  }
}

template("resource_copy_mac") {
  assert(defined(invoker.resources),
         "The source list of resources to copy over")
  assert(defined(invoker.bundle_directory),
         "The directory within the bundle to place the sources in")
  assert(defined(invoker.app_name),
         "The name of the application")

  _bundle_directory = invoker.bundle_directory
  _app_name = invoker.app_name
  _resources = invoker.resources

  copy(target_name) {
    set_sources_assignment_filter([])
    sources = _resources
    outputs = [ "$root_build_dir/$_app_name.app/$_bundle_directory/Contents/Resources/{{source_file_part}}" ]

    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
  }
}

template("mac_app") {

  assert(defined(invoker.deps),
         "Dependencies must be specified for $target_name")
  assert(defined(invoker.info_plist),
         "The application plist file must be specified for $target_name")
  assert(defined(invoker.app_name),
         "The name of Mac application for $target_name")
  assert(defined(invoker.xibs),
         "The list of XIB files must be specified for $target_name")
  # assert(defined(invoker.entitlements_path),
  #        "The entitlements path must be specified for $target_name")
  # assert(defined(invoker.code_signing_identity),
  #        "The entitlements path must be specified for $target_name")

  # We just create a variable so we can use the same in interpolation
  app_name = invoker.app_name

  # Generate the project structure

  struct_gen_target_name = target_name + "_struct"

  action(struct_gen_target_name) {

    script = mac_app_script

    sources = []
    outputs = [ "$root_build_dir/$app_name.app" ]

    args = [
      "structure",
      "-d",
      rebase_path(root_build_dir),
      "-n",
      app_name
    ]

  }

  # Generate the executable

  bin_gen_target_name = target_name + "_bin"

  executable(bin_gen_target_name) {
    deps = invoker.deps
    output_name = app_name
  }

  # Process the Info.plist

  plist_gen_target_name = target_name + "_plist"

  action(plist_gen_target_name) {

    script = mac_app_script

    sources = [ invoker.info_plist ]
    outputs = [ "$root_build_dir/plist/$app_name/Info.plist" ]

    args = [
      "plist",
      "-i",
      rebase_path(invoker.info_plist, root_build_dir),
      "-o",
      rebase_path("$root_build_dir/plist/$app_name"),
    ]
  }

  # Copy the generated binaries and assets to their appropriate locations

  copy_plist_gen_target_name = target_name + "_plist_copy"
  copy(copy_plist_gen_target_name) {
    sources = [
      "$root_build_dir/plist/$app_name/Info.plist",
    ]

    outputs = [
      "$root_build_dir/$app_name.app/Contents/{{source_file_part}}"
    ]

    deps = [
      ":$plist_gen_target_name",
    ]
  }

  copy_bin_target_name = target_name + "_bin_copy"
  copy(copy_bin_target_name) {
    sources = [
      "$root_build_dir/$app_name",
    ]

    outputs = [
      "$root_build_dir/$app_name.app/Contents/MacOS/{{source_file_part}}"
    ]

    deps = [
      ":$bin_gen_target_name",
    ]
  }

  copy_xib_target_name = target_name + "_xib_copy"
  process_nibs_mac(copy_xib_target_name) {
    sources = invoker.xibs
    module = app_name
    output_dir = "$app_name.app/Contents/Resources"
  }

  copy_all_target_name = target_name + "_all_copy"
  group(copy_all_target_name) {
    deps = [
      ":$struct_gen_target_name",
      ":$copy_plist_gen_target_name",
      ":$copy_bin_target_name",
      ":$copy_xib_target_name",
    ]
  }

  # Top level group

  group(target_name) {
    deps = [ ":$copy_all_target_name" ]
  }

}
