load("@fbsource//tools/build_defs/apple:flag_defs.bzl", "get_objc_arc_preprocessor_flags", "get_preprocessor_flags_for_build_mode")
load("@fbsource//tools/build_defs/oss:rn_defs.bzl", "react_native_xplat_target", "rn_apple_library", "rn_extra_build_flags")
load(
    "@fbsource//xplat/configurations/buck/apple/plugins/sad_xplat_hosted_configurations:react_module_registration.bzl",
    "react_module_plugin_providers",
)

rn_apple_library(
    name = "CoreModulesApple",
    srcs = glob(
        [
            "**/*.m",
            "**/*.mm",
        ],
    ),
    exported_headers = glob(["**/*.h"]),
    autoglob = False,
    compiler_flags = [
        "-Wno-error=unguarded-availability-new",
        "-Wno-unknown-warning-option",
        "-Wno-unused-property-ivar",
    ],
    contacts = ["oncall+react_native@xmail.facebook.com"],
    enable_exceptions = True,
    exported_preprocessor_flags = rn_extra_build_flags(),
    extension_api_only = True,
    frameworks = [
        "Foundation",
        "UIKit",
        "UserNotifications",
        "WebKit",
    ],
    header_path_prefix = "React",
    labels = [
        "depslint_never_remove",  # Some old NativeModule still relies on +load unfortunately.
        "disable_plugins_only_validation",
        "fbios_link_group:xplat/default/public.react_native.infra",
        "pfh:ReactNative_CommonInfrastructurePlaceholder",
        "talkios_link_group:xplat/default/public.react_native.infra",
    ],
    link_whole = True,
    platform_preprocessor_flags = [(
        "linux",
        ["-D PIC_MODIFIER=@PLT"],
    )],
    plugins =
        react_module_plugin_providers(
            name = "AccessibilityManager",
            native_class_func = "RCTAccessibilityManagerCls",
        ) + react_module_plugin_providers(
            name = "Appearance",
            native_class_func = "RCTAppearanceCls",
        ) + react_module_plugin_providers(
            name = "DeviceInfo",
            native_class_func = "RCTDeviceInfoCls",
        ) + react_module_plugin_providers(
            name = "ExceptionsManager",
            native_class_func = "RCTExceptionsManagerCls",
        ) + react_module_plugin_providers(
            name = "PlatformConstants",
            native_class_func = "RCTPlatformCls",
        ) + react_module_plugin_providers(
            name = "Clipboard",
            native_class_func = "RCTClipboardCls",
        ) + react_module_plugin_providers(
            name = "I18nManager",
            native_class_func = "RCTI18nManagerCls",
        ) + react_module_plugin_providers(
            name = "SourceCode",
            native_class_func = "RCTSourceCodeCls",
        ) + react_module_plugin_providers(
            name = "ActionSheetManager",
            native_class_func = "RCTActionSheetManagerCls",
        ) + react_module_plugin_providers(
            name = "AlertManager",
            native_class_func = "RCTAlertManagerCls",
        ) + react_module_plugin_providers(
            name = "Timing",
            native_class_func = "RCTTimingCls",
        ) + react_module_plugin_providers(
            name = "StatusBarManager",
            native_class_func = "RCTStatusBarManagerCls",
        ) + react_module_plugin_providers(
            name = "KeyboardObserver",
            native_class_func = "RCTKeyboardObserverCls",
        ) + react_module_plugin_providers(
            name = "AppState",
            native_class_func = "RCTAppStateCls",
        ) + react_module_plugin_providers(
            name = "PerfMonitor",
            native_class_func = "RCTPerfMonitorCls",
        ) + react_module_plugin_providers(
            name = "DevMenu",
            native_class_func = "RCTDevMenuCls",
        ) + react_module_plugin_providers(
            name = "DevSettings",
            native_class_func = "RCTDevSettingsCls",
        ) + react_module_plugin_providers(
            name = "RedBox",
            native_class_func = "RCTRedBoxCls",
        ) + react_module_plugin_providers(
            name = "LogBox",
            native_class_func = "RCTLogBoxCls",
        ) + react_module_plugin_providers(
            name = "WebSocketExecutor",
            native_class_func = "RCTWebSocketExecutorCls",
        ) + react_module_plugin_providers(
            name = "WebSocketModule",
            native_class_func = "RCTWebSocketModuleCls",
        ) + react_module_plugin_providers(
            name = "DevLoadingView",
            native_class_func = "RCTDevLoadingViewCls",
        ) + react_module_plugin_providers(
            name = "DevSplitBundleLoader",
            native_class_func = "RCTDevSplitBundleLoaderCls",
        ) + react_module_plugin_providers(
            name = "EventDispatcher",
            native_class_func = "RCTEventDispatcherCls",
        ),
    plugins_header = "FBCoreModulesPlugins.h",
    preprocessor_flags = get_objc_arc_preprocessor_flags() + get_preprocessor_flags_for_build_mode() + rn_extra_build_flags() + [
        "-DRN_DISABLE_OSS_PLUGIN_HEADER",
    ],
    reexport_all_header_dependencies = True,
    visibility = ["PUBLIC"],
    deps = [
        react_native_xplat_target("react/renderer/mapbuffer:mapbufferApple"),
    ],
    exported_deps = [
        "//xplat/js/react-native-github:FBReactNativeSpecApple",
        "//xplat/js/react-native-github:RCTLinkingApple",
        "//xplat/js/react-native-github:RCTPushNotificationApple",
        "//xplat/js/react-native-github:RCTSettingsApple",
        "//xplat/js/react-native-github:ReactInternalApple",
    ],
)
