# 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.
from multiprocessing import cpu_count

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

def gwt_genrule(module, deps, suffix = ""):
  dbg = 'ui_dbg' + suffix
  opt = 'ui_opt' + suffix
  soyc = 'ui_soyc' + suffix
  args = GWT_COMPILER_ARGS_RELEASE_MODE if suffix == "_r" else GWT_COMPILER_ARGS

  genrule(
    name = 'ui_optdbg' + suffix,
    cmd = 'cd $TMP;' +
      'unzip -q $(location :%s);' % dbg +
      'mv' +
      ' gerrit_ui/gerrit_ui.nocache.js' +
      ' gerrit_ui/dbg_gerrit_ui.nocache.js;' +
      'unzip -qo $(location :%s);' % opt +
      'mkdir -p \$(dirname $OUT);' +
      'zip -qr $OUT .',
    out = 'ui_optdbg' + suffix + '.zip',
    visibility = ['PUBLIC'],
  )

  gwt_binary(
    name = opt,
    modules = [module],
    module_deps = [':ui_module'],
    deps = deps + ([':' + dbg] if CPU_COUNT < 8 else []),
    local_workers = CPU_COUNT,
    strict = True,
    experimental_args = args,
    vm_args = GWT_JVM_ARGS,
  )

  gwt_binary(
    name = dbg,
    modules = [module],
    style = 'PRETTY',
    optimize = 0,
    module_deps = [':ui_module'],
    deps = deps,
    local_workers = CPU_COUNT,
    strict = True,
    experimental_args = args,
    vm_args = GWT_JVM_ARGS,
    visibility = ['PUBLIC'],
  )

  gwt_binary(
    name = soyc,
    modules = [module],
    module_deps = [':ui_module'],
    deps = deps + [':' + dbg],
    local_workers = CPU_COUNT,
    strict = True,
    experimental_args = args + ['-compileReport'],
    vm_args = GWT_JVM_ARGS,
   )

def gwt_user_agent_permutations(
    name,
    module_name,
    modules,
    style = 'PRETTY',
    optimize = 0,
    draft_compile = True,
    module_deps = [],
    deps = [],
    browsers = 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'/>" % modules[0],
      "<set-property name='user.agent' value='%s'/>" % impl,
      "<set-property name='locale' value='default'/>",
      "</module>",
    ])
    gwt = '%s_%s.gwt.xml' % (modules[0].replace('.', '/'), ua)
    gwt_name = '%s_%s' % (name, ua)
    jar = '%s.gwtxml.jar' % (gwt_name)

    genrule(
      name = '%s_gwtxml_gen' % gwt_name,
      cmd = 'cd $TMP;' +
        ('mkdir -p \$(dirname %s);' % gwt) +
        ('echo "%s">%s;' % (xml, gwt)) +
        'zip -qr $OUT .',
      out = jar,
    )
    prebuilt_jar(
      name = '%s_gwtxml_lib' % gwt_name,
      binary_jar = ':%s_gwtxml_gen' % gwt_name,
      gwt_jar = ':%s_gwtxml_gen' % gwt_name,
    )
    gwt_binary(
      name = gwt_name,
      modules = [modules[0] + '_' + ua],
      style = style,
      optimize = optimize,
      draft_compile = draft_compile,
      module_deps = module_deps + [':%s_gwtxml_lib' % gwt_name],
      deps = deps,
      local_workers = CPU_COUNT,
      strict = True,
      experimental_args = GWT_COMPILER_ARGS,
      vm_args = GWT_JVM_ARGS,
      visibility = visibility,
    )
