# 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/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_out_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_official_build) {
    defines = [ "_official_build" ]
  }
}

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,
          [ "$root_gen_dir/remoting/resources/{{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_out_dir/remoting/resources/{{source_name_part}}.lproj/locale.pak" ])
  } else {
    outputs = process_file_template(
            remoting_locales,
            [ "$root_out_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",
  ]
}
