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

import("//sky/build/skyx.gni")

template("sky_app") {
  skyx_target_name = target_name

  if (is_android || is_ios || is_mac) {
    skyx_target_name = "app"
  }

  skyx(skyx_target_name) {
    main_dart = invoker.main_dart

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

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

  if (is_android) {
    import("//build/config/android/rules.gni")

    bundle_prefix = target_name

    copy("gen_${bundle_prefix}_bundle") {
      sources = [
        "$target_gen_dir/app.skyx",
      ]
      outputs = [
        "$target_gen_dir/${bundle_prefix}.skyx",
      ]

      deps = [
        ":app",
      ]
    }

    copy_ex("assets") {
      clear_dir = true
      dest = "$target_gen_dir/assets"

      sources = [
        "$root_build_dir/icudtl.dat",
        "$target_gen_dir/app.skyx",
      ]
      deps = [
        ":$skyx_target_name",
        ":gen_${bundle_prefix}_bundle",
        "//third_party/icu:icudata",
      ]

      if (defined(invoker.bundles)) {
        foreach(bundle, invoker.bundles) {
          bundle_gen_dir = get_label_info(bundle, "target_gen_dir")
          bundle_dir = get_label_info(bundle, "dir")
          bundle_name = get_label_info(bundle, "name")
          sources += [ "$bundle_gen_dir/${bundle_name}.skyx" ]
          deps += [
            "$bundle_dir:gen_${bundle_name}_bundle",
          ]
        }
      }
    }

    android_apk(target_name) {
      apk_name = invoker.apk_name
      android_manifest = "apk/AndroidManifest.xml"

      native_libs = [ "libsky_shell.so" ]
      asset_location = "$target_gen_dir/assets"

      extensions_to_not_compress = ".skyx"

      deps = [
        "//base:base_java",
        "//sky/shell:assets",
        "//sky/shell:java",
        "//sky/shell:sky_shell",
        ":assets",
      ]

      if (defined(invoker.deps)) {
        deps += invoker.deps
      }
    }
  } else if (is_ios && defined(invoker.info_plist)) {
    import("//build/config/ios/rules.gni")
    import("//build/config/ios/ios_sdk.gni")

    ios_app(target_name) {
      app_name = target_name + "_app"

      code_signing_identity = ios_code_signing_identity

      info_plist = invoker.info_plist

      if (defined(invoker.entitlements_path)) {
        entitlements_path = invoker.entitlements_path
      } else {
        entitlements_path = "//sky/shell/ios/Entitlements.xcent"
      }

      resources_gen_target_name = target_name + "_res"
      resource_copy_ios(resources_gen_target_name) {
        resources = [
          "//third_party/icu/android/icudtl.dat",
          "$target_gen_dir/app.skyx",
        ]

        if (defined(invoker.launcher_resources)) {
          resources += invoker.launcher_resources
        }

        bundle_directory = "."
        deps = [ ":app" ]
      }

      deps = [
        "//sky/shell:ios_scaffolding",
        ":$resources_gen_target_name",
        ":$skyx_target_name",
      ]

      if (defined(invoker.deps)) {
        deps += invoker.deps
      }
    }
  } else if(is_mac && defined(invoker.info_plist)) {
    import("//build/config/mac/rules.gni")

    mac_app(target_name) {

      app_name = target_name + "_app"
      info_plist = invoker.info_plist
      xibs = invoker.xibs

      resources_gen_target_name = target_name + "_res"
      resource_copy_mac(resources_gen_target_name) {
        resources = [
          "//third_party/icu/android/icudtl.dat",
          "$target_gen_dir/app.skyx",
        ]

        if (defined(invoker.launcher_resources)) {
          resources += invoker.launcher_resources
        }

        bundle_directory = "."
        deps = [ ":app" ]
      }

      deps = [
        ":$resources_gen_target_name",
        "//sky/shell:mac_scaffolding",
      ]

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

  } else if(is_ios || is_mac) {
    # No Info.plist specified. But we still need an empty target
    group(target_name) {
    }
  }
}
