# 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

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_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_DEPS = [
  '//native/third-party/jsc:jsc',
  '//native/third-party/jsc:jsc_legacy_profiler',
]

CSSLAYOUT_TARGET = '//ReactAndroid/src/main/java/com/facebook:csslayout'
FBGLOGINIT_TARGET = '//ReactAndroid/src/main/jni/first-party/fbgloginit:fbgloginit'

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

  common_processors = [
    'com.facebook.react.processing.ReactPropertyProcessor',
  ]
  common_processor_deps = [
    react_native_target('java/com/facebook/react/processing:processing'),
  ]

  if react_native_target('java/com/facebook/react/uimanager/annotations:annotations') in deps and name != 'processing':
      annotation_processors = list(set(annotation_processors + common_processors))
      annotation_processor_deps = list(set(annotation_processor_deps + common_processor_deps))

  original_android_library(
    name=name,
    deps=deps,
    annotation_processors=annotation_processors,
    annotation_processor_deps=annotation_processor_deps,
    *args,
    **kwargs)


def robolectric3_test(name, deps, 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'))

  # defined in BUCK
  robolectric_test(
    name=name,
    deps=deps,
    vm_args=vm_args + extra_vm_args,
    *args,
    **kwargs
  )
