# Copyright 2014 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("//remoting/remoting_locales.gni")
import("//tools/grit/grit_rule.gni")

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

group("resources") {
  public_deps = [
    ":copy_locales",
    ":strings",
    ":verify_resources",
  ]
}

# TODO(GYP) enable verify_resources. The bots are complaining about
# gen/main.html not being found but this doesn't seems to reproduce locally.

action("verify_resources") {
  script = "//remoting/tools/verify_resources.py"

  sources_to_verify = [
    #    "$root_gen_dir/main.html",
    "../host/continue_window_mac.mm",
    "../host/disconnect_window_mac.mm",
    "../host/installer/mac/uninstaller/remoting_uninstaller-InfoPlist.strings.jinja2",
    "../host/mac/me2me_preference_pane-InfoPlist.strings.jinja2",
    "../host/win/core.rc.jinja2",
    "../host/win/host_messages.mc.jinja2",
    "../host/win/version.rc.jinja2",
    "../resources/play_store_resources.cc",
    "../webapp/crd/js/background.js",
    "../webapp/crd/js/butter_bar.js",
    "../webapp/base/js/error.js",
    "../webapp/crd/js/host_list.js",
    "../webapp/crd/js/host_setup_dialog.js",
    "../webapp/crd/js/host_table_entry.js",
    "../webapp/crd/manifest.json.jinja2",
    "../webapp/crd/js/paired_client_manager.js",
    "../webapp/crd/js/desktop_remoting.js",
    "../webapp/crd/js/window_frame.js",
  ]

  inputs = [ "remoting_strings.grd" ] + sources_to_verify

  stampfile = "$root_build_dir/remoting_resources_verified_stamp"
  outputs = [
    stampfile,
  ]

  args = [
           "-t",
           rebase_path(stampfile, root_build_dir),
           "-r",
           rebase_path("remoting_strings.grd", root_build_dir),
         ] + rebase_path(sources_to_verify, root_build_dir)

  deps = [
    #    "//remoting/webapp:webapp",
  ]  # Generates main.html.
}

if (is_android) {
  android_string_outputs =
      [ "remoting/android/res/values/remoting_strings.xml" ]
  android_string_outputs += process_file_template(
          remoting_android_locales,
          [ "remoting/android/res/values-{{source_name_part}}/remoting_strings.xml" ])
}

grit("strings") {
  source = "remoting_strings.grd"
  output_name = "remoting_strings"

  # The grd file encodes "remoting/..." in the name, so root everything in the
  # generated file root.
  output_dir = root_gen_dir

  outputs = [
    "remoting/base/string_resources.h",
  ]

  # The grd produces a *.pak file and a messages.json file (this one uses
  # underscores instead of hyphens) for each locale.
  outputs +=
      process_file_template(remoting_locales,
                            [ "remoting/resources/{{source_name_part}}.pak" ])

  outputs += remoting_webapp_locale_files

  if (is_android) {
    outputs += android_string_outputs
  }
}

if (is_android) {
  java_strings_grd_prebuilt("strings_java") {
    grit_output_dir = "$root_gen_dir/remoting/android/res"
    generated_files =
        rebase_path(android_string_outputs, "remoting/android/res", ".")
    deps = [
      ":strings",
    ]
  }
}

action("copy_locales") {
  script = "../tools/build/remoting_copy_locales.py"

  # The gyp build calls out to Python, but the Python just computes a simple
  # replacement over the locales. Here, we can do this in GN script by
  # pretending the locale list is a list of files. The {{source_name_part}}
  # will just expand to the locale name.
  inputs = process_file_template(remoting_locales,
                                 [ "$target_gen_dir/{{source_name_part}}.pak" ])

  # Likewise, process the outputs in the same way as the inputs.
  if (is_mac || is_ios) {
    # On mac, use underscores instead of hyphens and put the files in a
    # different place.
    outputs = process_file_template(
            remoting_locales_with_underscores,
            [ "$root_build_dir/remoting/resources/{{source_name_part}}.lproj/locale.pak" ])
  } else {
    outputs = process_file_template(
            remoting_locales,
            [ "$root_build_dir/remoting_locales/{{source_name_part}}.pak" ])
  }

  args = [
           "-p",
           current_os,
           "-g",
           rebase_path(root_gen_dir, root_build_dir),
           "-x",
           rebase_path(root_out_dir, root_build_dir),
         ] + remoting_locales

  deps = [
    ":strings",
  ]
}
