# 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 = [
      ":$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" ]
  }
}
