#####################################
# Defines
#####################################
COMMON_PREPROCESSOR_FLAGS = [
  '-fobjc-arc',
  '-DDEBUG=1',
]

COMMON_LANG_PREPROCESSOR_FLAGS = {
  'C': ['-std=gnu99'],
  'CXX': ['-std=c++11', '-stdlib=libc++'],
  'OBJCXX': ['-std=c++11', '-stdlib=libc++'],
}

COMMON_LINKER_FLAGS = ['-ObjC++']

ASYNCDISPLAYKIT_EXPORTED_HEADERS = glob([
  'AsyncDisplayKit/*.h',
  'AsyncDisplayKit/Details/**/*.h',
  'AsyncDisplayKit/Layout/*.h',
  'Base/*.h',
  'AsyncDisplayKit/Debug/ASLayoutElementInspectorNode.h',
  # Most TextKit components are not public because the C++ content
  # in the headers will cause build errors when using
  # `use_frameworks!` on 0.39.0 & Swift 2.1.
  # See https://github.com/facebook/AsyncDisplayKit/issues/1153
  'AsyncDisplayKit/TextKit/ASTextNodeTypes.h',
  'AsyncDisplayKit/TextKit/ASTextKitComponents.h'
])

ASYNCDISPLAYKIT_PRIVATE_HEADERS = glob([
    'AsyncDisplayKit/**/*.h'
  ],
  excludes = ASYNCDISPLAYKIT_EXPORTED_HEADERS,
)

def asyncdisplaykit_library(
    name,
    additional_preprocessor_flags = [],
    deps = [],
    additional_frameworks = []):

  apple_library(
    name = name,
    prefix_header = 'AsyncDisplayKit/AsyncDisplayKit-Prefix.pch',
    header_path_prefix = 'AsyncDisplayKit',
    exported_headers = ASYNCDISPLAYKIT_EXPORTED_HEADERS,
    headers = ASYNCDISPLAYKIT_PRIVATE_HEADERS,
    srcs = glob([
      'AsyncDisplayKit/**/*.m',
      'AsyncDisplayKit/**/*.mm',
      'Base/*.m'
    ]),
    preprocessor_flags = COMMON_PREPROCESSOR_FLAGS + additional_preprocessor_flags,
    lang_preprocessor_flags = COMMON_LANG_PREPROCESSOR_FLAGS,
    linker_flags = COMMON_LINKER_FLAGS + [
      '-weak_framework',
      'Photos',
      '-weak_framework',
      'MapKit',
    ],
    deps = deps,
    frameworks = [
      '$SDKROOT/System/Library/Frameworks/Foundation.framework',
      '$SDKROOT/System/Library/Frameworks/UIKit.framework',
      '$SDKROOT/System/Library/Frameworks/AssetsLibrary.framework',

      '$SDKROOT/System/Library/Frameworks/QuartzCore.framework',
      '$SDKROOT/System/Library/Frameworks/CoreMedia.framework',
      '$SDKROOT/System/Library/Frameworks/CoreText.framework',
      '$SDKROOT/System/Library/Frameworks/CoreGraphics.framework',
      '$SDKROOT/System/Library/Frameworks/CoreLocation.framework',
      '$SDKROOT/System/Library/Frameworks/AVFoundation.framework',
    ] + additional_frameworks,
    visibility = ['PUBLIC'],
  )

#####################################
# AsyncDisplayKit targets
#####################################
asyncdisplaykit_library(
  name = 'AsyncDisplayKit-Core',
)

# (Default) AsyncDisplayKit and AsyncDisplayKit-PINRemoteImage targets are basically the same library with different names
for name in ['AsyncDisplayKit', 'AsyncDisplayKit-PINRemoteImage']:
  asyncdisplaykit_library(
    name = name,
    additional_preprocessor_flags = ['-DPIN_REMOTE_IMAGE=1'],
    deps = [
      '//Pods/PINRemoteImage:PINRemoteImage-PINCache',
    ],
    additional_frameworks = [
      '$SDKROOT/System/Library/Frameworks/MobileCoreServices.framework',
    ]
  )

#####################################
# Test Host
# TODO: Split to smaller BUCK files and parse in parallel
#####################################
apple_resource(
  name = 'TestHostResources',
  files = ['Default-568h@2x.png'],
  dirs = [],
)

apple_bundle(
  name = 'TestHost',
  binary = ':TestHostBinary',
  extension = 'app',
  info_plist = 'AsyncDisplayKitTestHost/Info.plist',
  info_plist_substitutions = {
    'PRODUCT_BUNDLE_IDENTIFIER': 'com.facebook.AsyncDisplayKitTestHost',
  },
  tests = [':Tests'],
)

apple_binary(
  name = 'TestHostBinary',
  headers = glob(['AsyncDisplayKitTestHost/*.h']),
  srcs = glob([
    'AsyncDisplayKitTestHost/*.m',
    'AsyncDisplayKitTestHost/*.mm',
  ]),
  lang_preprocessor_flags = COMMON_LANG_PREPROCESSOR_FLAGS,
  linker_flags = COMMON_LINKER_FLAGS,
  deps = [
    ':TestHostResources',
    ':AsyncDisplayKit-Core',
  ],
  frameworks = [
    '$SDKROOT/System/Library/Frameworks/Photos.framework',
    '$SDKROOT/System/Library/Frameworks/MapKit.framework',
  ],
)

apple_package(
  name = 'TestHostPackage',
  bundle = ':TestHost',
)

#####################################
# Tests
#####################################
apple_resource(
  name = 'TestsResources',
  files = ['AsyncDisplayKitTests/en.lproj/InfoPlist.strings'],
  dirs = ['AsyncDisplayKitTests/TestResources'],
)

apple_test(
  name = 'Tests',
  test_host_app = ':TestHost',
  info_plist = 'AsyncDisplayKitTests/AsyncDisplayKitTests-Info.plist',
  info_plist_substitutions = {
    'PRODUCT_BUNDLE_IDENTIFIER': 'com.facebook.AsyncDisplayKitTests',
  },
  prefix_header = 'AsyncDisplayKitTests/AsyncDisplayKitTests-Prefix.pch',
  # Expose all ASDK headers to tests
  headers = ASYNCDISPLAYKIT_EXPORTED_HEADERS + ASYNCDISPLAYKIT_PRIVATE_HEADERS + glob([
    'AsyncDisplayKitTests/*.h',
  ]),
  srcs = glob([
      'AsyncDisplayKitTests/*.m',
      'AsyncDisplayKitTests/*.mm'
    ],
    # ASTextNodePerformanceTests are excluded (#2173)
    excludes = ['AsyncDisplayKitTests/ASTextNodePerformanceTests.m*']
  ),
  snapshot_reference_images_path='AsyncDisplayKitTests/ReferenceImages',
  preprocessor_flags = COMMON_PREPROCESSOR_FLAGS + [
    '-Wno-implicit-function-declaration',
  ],
  lang_preprocessor_flags = COMMON_LANG_PREPROCESSOR_FLAGS,
  linker_flags = COMMON_LINKER_FLAGS,
  deps = [
    ':TestsResources',
    '//Pods/OCMock:OCMock',
    '//Pods/FBSnapshotTestCase:FBSnapshotTestCase',
    '//Pods/JGMethodSwizzler:JGMethodSwizzler',
  ],
  frameworks = [
    '$SDKROOT/System/Library/Frameworks/Foundation.framework',
    '$SDKROOT/System/Library/Frameworks/UIKit.framework',

    '$SDKROOT/System/Library/Frameworks/CoreMedia.framework',
    '$SDKROOT/System/Library/Frameworks/CoreText.framework',
    '$SDKROOT/System/Library/Frameworks/CoreGraphics.framework',
    '$SDKROOT/System/Library/Frameworks/AVFoundation.framework',

    '$PLATFORM_DIR/Developer/Library/Frameworks/XCTest.framework',
  ],
)
