# 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) {
    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 = [
      ":$copy_bin_target_name",
      ":$copy_plist_gen_target_name",
      ":$copy_xib_target_name",
      ":$struct_gen_target_name",
    ]
  }

  # Top level group

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