/**
 * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
 *
 * Do not edit this file as changes may cause incorrect behavior and will be lost
 * once the code is regenerated.
 *
 * @generated by codegen project: GenerateModuleObjCpp
 *
 * We create an umbrella header (and corresponding implementation) here since
 * Cxx compilation in BUCK has a limitation: source-code producing genrule()s
 * must have a single output. More files => more genrule()s => slower builds.
 */

#ifndef __cplusplus
#error This file must be compiled as Obj-C++. If you are importing it, you must change your file extension to .mm.
#endif

// Avoid multiple includes of RNFBMessagingTurboModules symbols
#ifndef RNFBMessagingTurboModules_H
#define RNFBMessagingTurboModules_H

#import <Foundation/Foundation.h>
#import <RCTRequired/RCTRequired.h>
#import <RCTTypeSafety/RCTConvertHelpers.h>
#import <RCTTypeSafety/RCTTypedModuleConstants.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTCxxConvert.h>
#import <React/RCTManagedPointer.h>
#import <ReactCommon/RCTTurboModule.h>
#import <optional>
#import <vector>


NS_ASSUME_NONNULL_BEGIN
namespace JS {
  namespace NativeRNFBTurboMessaging {
    struct IOSPermissions {
      std::optional<bool> alert() const;
      std::optional<bool> announcement() const;
      std::optional<bool> badge() const;
      std::optional<bool> carPlay() const;
      std::optional<bool> criticalAlert() const;
      std::optional<bool> provisional() const;
      std::optional<bool> sound() const;
      std::optional<bool> providesAppNotificationSettings() const;

      IOSPermissions(NSDictionary *const v) : _v(v) {}
    private:
      NSDictionary *_v;
    };
  }
}

@interface RCTCxxConvert (NativeRNFBTurboMessaging_IOSPermissions)
+ (RCTManagedPointer *)JS_NativeRNFBTurboMessaging_IOSPermissions:(id)json;
@end
namespace JS {
  namespace NativeRNFBTurboMessaging {
    struct Constants {

      struct Builder {
        // Backwards compat for RCTTypedModuleConstants
        using ResultT = Constants;

        struct Input {
          RCTRequired<bool> isAutoInitEnabled;
          RCTRequired<bool> isDeliveryMetricsExportToBigQueryEnabled;
          std::optional<bool> isRegisteredForRemoteNotifications;
          std::optional<bool> isNotificationDelegationEnabled;
        };

        /** Initialize with a set of values */
        Builder(const Input i);
        /** Initialize with an existing Constants */
        Builder(Constants i);
        /** Builds the object. Generally used only by the infrastructure. */
        NSDictionary *buildUnsafeRawValue() const { return _factory(); };
      private:
        NSDictionary *(^_factory)(void);
      };

      static Constants fromUnsafeRawValue(NSDictionary *const v) { return {v}; }
      NSDictionary *unsafeRawValue() const { return _v; }
    private:
      Constants(NSDictionary *const v) : _v(v) {}
      NSDictionary *_v;
    };
  }
}
@protocol NativeRNFBTurboMessagingSpec <RCTBridgeModule, RCTTurboModule>

- (void)getInitialNotification:(RCTPromiseResolveBlock)resolve
                        reject:(RCTPromiseRejectBlock)reject;
- (void)getDidOpenSettingsForNotification:(RCTPromiseResolveBlock)resolve
                                   reject:(RCTPromiseRejectBlock)reject;
- (void)setAutoInitEnabled:(BOOL)enabled
                   resolve:(RCTPromiseResolveBlock)resolve
                    reject:(RCTPromiseRejectBlock)reject;
- (void)signalBackgroundMessageHandlerSet;
- (void)completeNotificationProcessing;
- (void)getToken:(NSString *)appName
        senderId:(NSString *)senderId
         resolve:(RCTPromiseResolveBlock)resolve
          reject:(RCTPromiseRejectBlock)reject;
- (void)deleteToken:(NSString *)appName
           senderId:(NSString *)senderId
            resolve:(RCTPromiseResolveBlock)resolve
             reject:(RCTPromiseRejectBlock)reject;
- (void)getAPNSToken:(RCTPromiseResolveBlock)resolve
              reject:(RCTPromiseRejectBlock)reject;
- (void)setAPNSToken:(NSString *)token
                type:(NSString *)type
             resolve:(RCTPromiseResolveBlock)resolve
              reject:(RCTPromiseRejectBlock)reject;
- (void)getIsHeadless:(RCTPromiseResolveBlock)resolve
               reject:(RCTPromiseRejectBlock)reject;
- (void)requestPermission:(JS::NativeRNFBTurboMessaging::IOSPermissions &)permissions
                  resolve:(RCTPromiseResolveBlock)resolve
                   reject:(RCTPromiseRejectBlock)reject;
- (void)registerForRemoteNotifications:(RCTPromiseResolveBlock)resolve
                                reject:(RCTPromiseRejectBlock)reject;
- (void)unregisterForRemoteNotifications:(RCTPromiseResolveBlock)resolve
                                  reject:(RCTPromiseRejectBlock)reject;
- (void)hasPermission:(RCTPromiseResolveBlock)resolve
               reject:(RCTPromiseRejectBlock)reject;
- (void)sendMessage:(NSDictionary *)remoteMessageMap
            resolve:(RCTPromiseResolveBlock)resolve
             reject:(RCTPromiseRejectBlock)reject;
- (void)subscribeToTopic:(NSString *)topic
                 resolve:(RCTPromiseResolveBlock)resolve
                  reject:(RCTPromiseRejectBlock)reject;
- (void)unsubscribeFromTopic:(NSString *)topic
                     resolve:(RCTPromiseResolveBlock)resolve
                      reject:(RCTPromiseRejectBlock)reject;
- (void)setDeliveryMetricsExportToBigQuery:(BOOL)enabled
                                   resolve:(RCTPromiseResolveBlock)resolve
                                    reject:(RCTPromiseRejectBlock)reject;
- (void)setNotificationDelegationEnabled:(BOOL)enabled
                                 resolve:(RCTPromiseResolveBlock)resolve
                                  reject:(RCTPromiseRejectBlock)reject;
- (void)isNotificationDelegationEnabled:(RCTPromiseResolveBlock)resolve
                                 reject:(RCTPromiseRejectBlock)reject;
- (facebook::react::ModuleConstants<JS::NativeRNFBTurboMessaging::Constants::Builder>)constantsToExport;
- (facebook::react::ModuleConstants<JS::NativeRNFBTurboMessaging::Constants::Builder>)getConstants;

@end

@interface NativeRNFBTurboMessagingSpecBase : NSObject {
@protected
facebook::react::EventEmitterCallback _eventEmitterCallback;
}
- (void)setEventEmitterCallback:(EventEmitterCallbackWrapper *)eventEmitterCallbackWrapper;


@end

namespace facebook::react {
  /**
   * ObjC++ class for module 'NativeRNFBTurboMessaging'
   */
  class JSI_EXPORT NativeRNFBTurboMessagingSpecJSI : public ObjCTurboModule {
  public:
    NativeRNFBTurboMessagingSpecJSI(const ObjCTurboModule::InitParams &params);
  };
} // namespace facebook::react
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::alert() const
{
  id const p = _v[@"alert"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::announcement() const
{
  id const p = _v[@"announcement"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::badge() const
{
  id const p = _v[@"badge"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::carPlay() const
{
  id const p = _v[@"carPlay"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::criticalAlert() const
{
  id const p = _v[@"criticalAlert"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::provisional() const
{
  id const p = _v[@"provisional"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::sound() const
{
  id const p = _v[@"sound"];
  return RCTBridgingToOptionalBool(p);
}
inline std::optional<bool> JS::NativeRNFBTurboMessaging::IOSPermissions::providesAppNotificationSettings() const
{
  id const p = _v[@"providesAppNotificationSettings"];
  return RCTBridgingToOptionalBool(p);
}
inline JS::NativeRNFBTurboMessaging::Constants::Builder::Builder(const Input i) : _factory(^{
  NSMutableDictionary *d = [NSMutableDictionary new];
  auto isAutoInitEnabled = i.isAutoInitEnabled.get();
  d[@"isAutoInitEnabled"] = @(isAutoInitEnabled);
  auto isDeliveryMetricsExportToBigQueryEnabled = i.isDeliveryMetricsExportToBigQueryEnabled.get();
  d[@"isDeliveryMetricsExportToBigQueryEnabled"] = @(isDeliveryMetricsExportToBigQueryEnabled);
  auto isRegisteredForRemoteNotifications = i.isRegisteredForRemoteNotifications;
  d[@"isRegisteredForRemoteNotifications"] = isRegisteredForRemoteNotifications.has_value() ? @((BOOL)isRegisteredForRemoteNotifications.value()) : nil;
  auto isNotificationDelegationEnabled = i.isNotificationDelegationEnabled;
  d[@"isNotificationDelegationEnabled"] = isNotificationDelegationEnabled.has_value() ? @((BOOL)isNotificationDelegationEnabled.value()) : nil;
  return d;
}) {}
inline JS::NativeRNFBTurboMessaging::Constants::Builder::Builder(Constants i) : _factory(^{
  return i.unsafeRawValue();
}) {}
NS_ASSUME_NONNULL_END
#endif // RNFBMessagingTurboModules_H
