# 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/flx.gni")

template("sky_app") {
  flx_target_name = target_name

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

  flx(flx_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.flx",
      ]
      outputs = [
        "$target_gen_dir/${bundle_prefix}.flx",
      ]

      deps = [
        ":app",
      ]
    }

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

      sources = [
        "$root_build_dir/icudtl.dat",
        "$target_gen_dir/app.flx"
      ]
      if (defined(invoker.manifest)) {
        sources += [ invoker.manifest ]
      }
      deps = [
        ":$flx_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}.flx" ]
          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 = ".flx"

      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")
    import("//sky/engine/bindings/bindings.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.flx",
        ]

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

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

      precompiled_gen_target = target_name + "_precompiled"
      dart_precompile(precompiled_gen_target) {
        dart_package_root = rebase_path("packages", root_build_dir)
        dart_script = invoker.main_dart
      }

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

      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.flx",
        ]

        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) {
    }
  }
}
