# Copyright (C) 2013 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

BROWSERS = [
  'chrome',
  'firefox',
  'gecko1_8',
  'safari',
  'msie', 'ie6', 'ie8', 'ie9',
]
ALIASES = {
  'chrome': 'safari',
  'firefox': 'gecko1_8',
  'msie': 'ie9',
}
MODULE = 'com.google.gerrit.GerritGwtUI'

DEBUG_OPTS = [
  '-style', 'PRETTY',
  '-optimize', '0',
]

APP_DEPS = [':ui_module']

def gwt_user_agent_permutations(
    name,
    module_name,
    module_target,
    compiler_opts = [],
    deps = [],
    browsers = [],
    visibility = []):
  for ua in browsers:
    impl = ua
    if ua in ALIASES:
      impl = ALIASES[ua]
    xml = ''.join([
      "<module rename-to='%s'>" % module_name,
      "<inherits name='%s'/>" % module_target,
      "<set-property name='user.agent' value='%s'/>" % impl,
      "<set-property name='locale' value='default'/>",
      "</module>",
    ])
    gwt = '%s_%s.gwt.xml' % (module_target.replace('.', '/'), ua)
    jar = '%s_%s.gwtxml.jar' % (name, ua)
    genrule(
      name = '%s_%s_gwtxml_gen' % (name, ua),
      cmd = 'cd $TMP;' +
        ('mkdir -p $(dirname %s);' % gwt) +
        ('echo "%s">%s;' % (xml, gwt)) +
        'zip -qr $OUT .',
      out = jar,
    )
    prebuilt_jar(
      name = '%s_%s_gwtxml_lib' % (name, ua),
      binary_jar = genfile(jar),
      deps = [':%s_%s_gwtxml_gen' % (name, ua)],
    )
    gwt_application(
      name = '%s_%s' % (name, ua),
      module_target = module_target + '_' + ua,
      compiler_opts = compiler_opts,
      deps = deps + [':%s_%s_gwtxml_lib' % (name, ua)],
      visibility = visibility,
    )

