# 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",
    ]
  }
}
