# Helpers for referring to React Native open source code.
#
# This lets us build React Native:
# - At Facebook by running buck from the root of the fb repo
# - Outside of Facebook by running buck in the root of the git repo

IS_OSS_BUILD = True

with allow_unsafe_import():
    import os

# Example: react_native_target('java/com/facebook/react/common:common')
def react_native_target(path):
  return '//ReactAndroid/src/main/' + path

# Example: react_native_xplat_target('bridge:bridge')
def react_native_xplat_target(path):
  return '//ReactCommon/' + path

# Example: react_native_tests_target('java/com/facebook/react/modules:modules')
def react_native_tests_target(path):
  return '//ReactAndroid/src/test/' + path

# Example: react_native_integration_tests_target('java/com/facebook/react/testing:testing')
def react_native_integration_tests_target(path):
  return '//ReactAndroid/src/androidTest/' + path

# Helper for referring to non-RN code from RN OSS code.
# Example: react_native_dep('java/com/facebook/systrace:systrace')
def react_native_dep(path):
  return '//ReactAndroid/src/main/' + path

JSC_INTERNAL_DEPS = [
  '//native/third-party/jsc:jsc',
  '//native/third-party/jsc:jsc_legacy_profiler',
]
JSC_DEPS = JSC_INTERNAL_DEPS

YOGA_TARGET = '//ReactAndroid/src/main/java/com/facebook:yoga'
FBGLOGINIT_TARGET = '//ReactAndroid/src/main/jni/first-party/fbgloginit:fbgloginit'
FBJNI_TARGET = '//ReactAndroid/src/main/jni/first-party/fb:jni'
JNI_TARGET = '//ReactAndroid/src/main/jni/first-party/jni-hack:jni-hack'

# React property preprocessor
original_android_library=android_library
def android_library(
  name,
  deps=[],
  plugins=[],
  *args,
  **kwargs):

  if react_native_target('java/com/facebook/react/uimanager/annotations:annotations') in deps and name != 'processing':
    react_property_plugins = [
      react_native_target('java/com/facebook/react/processing:processing'),
    ]

    plugins = list(set(plugins + react_property_plugins))

  if react_native_target('java/com/facebook/react/module/annotations:annotations') in deps and name != 'processing':
    react_module_plugins = [
      react_native_target('java/com/facebook/react/module/processing:processing'),
    ]

    plugins = list(set(plugins + react_module_plugins))

  original_android_library(
    name=name,
    deps=deps,
    plugins=plugins,
    *args,
    **kwargs)

def rn_robolectric_test(name, srcs, vm_args = None, *args, **kwargs):
  vm_args = vm_args or []

  # We may need to create buck-out/gen/ if we're running after buck clean.
  tmp = 'buck-out/gen/' + get_base_path() + '/__java_test_' + name + '_output__'
  extra_vm_args = [
    '-XX:+UseConcMarkSweepGC', # required by -XX:+CMSClassUnloadingEnabled
    '-XX:+CMSClassUnloadingEnabled',
    '-XX:ReservedCodeCacheSize=150M',
    '-Drobolectric.dependency.dir=buck-out/gen/ReactAndroid/src/main/third-party/java/robolectric3/robolectric',
    '-Dlibraries=buck-out/gen/ReactAndroid/src/main/third-party/java/robolectric3/robolectric/*.jar',
    '-Drobolectric.logging.enabled=true',
    '-XX:MaxPermSize=620m',
    '-Drobolectric.offline=true',
  ]
  if os.path.isdir("/dev/shm"):
      extra_vm_args.append('-Djava.io.tmpdir=/dev/shm')
  else:
      extra_vm_args.append(
          '-Djava.io.tmpdir=%s' % os.path.join(os.path.abspath('.'),
                                               'buck-out/bin'))

  # RN tests use  Powermock, which means they get their own ClassLoaders.
  # Because the yoga native library (or any native library) can only be loaded into one
  # ClassLoader at a time, we need to run each in its own process, hence fork_mode = 'per_test'.
  robolectric_test(
    name = name,
    use_cxx_libraries = True,
    cxx_library_whitelist = [
      '//ReactCommon/yoga:yoga',
      '//ReactAndroid/src/main/jni/first-party/yogajni:jni',
    ],
    fork_mode = 'per_test',
    srcs = srcs,
    vm_args = vm_args + extra_vm_args,
    *args, **kwargs)

original_cxx_library = cxx_library
def cxx_library(allow_jni_merging=None, **kwargs):
    original_cxx_library(**kwargs)