#if 0
#elif defined(__arm64__) && __arm64__
// Generated by Apple Swift version 5.9 (swiftlang-5.9.0.128.108 clang-1500.0.40.1)
#ifndef FLYBITSSDK_SWIFT_H
#define FLYBITSSDK_SWIFT_H
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgcc-compat"

#if !defined(__has_include)
# define __has_include(x) 0
#endif
#if !defined(__has_attribute)
# define __has_attribute(x) 0
#endif
#if !defined(__has_feature)
# define __has_feature(x) 0
#endif
#if !defined(__has_warning)
# define __has_warning(x) 0
#endif

#if __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
#endif

#pragma clang diagnostic ignored "-Wauto-import"
#if defined(__OBJC__)
#include <Foundation/Foundation.h>
#endif
#if defined(__cplusplus)
#include <cstdint>
#include <cstddef>
#include <cstdbool>
#include <cstring>
#include <stdlib.h>
#include <new>
#include <type_traits>
#else
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include <string.h>
#endif
#if defined(__cplusplus)
#if defined(__arm64e__) && __has_include(<ptrauth.h>)
# include <ptrauth.h>
#else
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wreserved-macro-identifier"
# ifndef __ptrauth_swift_value_witness_function_pointer
#  define __ptrauth_swift_value_witness_function_pointer(x)
# endif
# ifndef __ptrauth_swift_class_method_pointer
#  define __ptrauth_swift_class_method_pointer(x)
# endif
#pragma clang diagnostic pop
#endif
#endif

#if !defined(SWIFT_TYPEDEFS)
# define SWIFT_TYPEDEFS 1
# if __has_include(<uchar.h>)
#  include <uchar.h>
# elif !defined(__cplusplus)
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
# endif
typedef float swift_float2  __attribute__((__ext_vector_type__(2)));
typedef float swift_float3  __attribute__((__ext_vector_type__(3)));
typedef float swift_float4  __attribute__((__ext_vector_type__(4)));
typedef double swift_double2  __attribute__((__ext_vector_type__(2)));
typedef double swift_double3  __attribute__((__ext_vector_type__(3)));
typedef double swift_double4  __attribute__((__ext_vector_type__(4)));
typedef int swift_int2  __attribute__((__ext_vector_type__(2)));
typedef int swift_int3  __attribute__((__ext_vector_type__(3)));
typedef int swift_int4  __attribute__((__ext_vector_type__(4)));
typedef unsigned int swift_uint2  __attribute__((__ext_vector_type__(2)));
typedef unsigned int swift_uint3  __attribute__((__ext_vector_type__(3)));
typedef unsigned int swift_uint4  __attribute__((__ext_vector_type__(4)));
#endif

#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if !defined(SWIFT_CLASS_PROPERTY)
# if __has_feature(objc_class_property)
#  define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
# else
#  define SWIFT_CLASS_PROPERTY(...) 
# endif
#endif
#if !defined(SWIFT_RUNTIME_NAME)
# if __has_attribute(objc_runtime_name)
#  define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
# else
#  define SWIFT_RUNTIME_NAME(X) 
# endif
#endif
#if !defined(SWIFT_COMPILE_NAME)
# if __has_attribute(swift_name)
#  define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
# else
#  define SWIFT_COMPILE_NAME(X) 
# endif
#endif
#if !defined(SWIFT_METHOD_FAMILY)
# if __has_attribute(objc_method_family)
#  define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
# else
#  define SWIFT_METHOD_FAMILY(X) 
# endif
#endif
#if !defined(SWIFT_NOESCAPE)
# if __has_attribute(noescape)
#  define SWIFT_NOESCAPE __attribute__((noescape))
# else
#  define SWIFT_NOESCAPE 
# endif
#endif
#if !defined(SWIFT_RELEASES_ARGUMENT)
# if __has_attribute(ns_consumed)
#  define SWIFT_RELEASES_ARGUMENT __attribute__((ns_consumed))
# else
#  define SWIFT_RELEASES_ARGUMENT 
# endif
#endif
#if !defined(SWIFT_WARN_UNUSED_RESULT)
# if __has_attribute(warn_unused_result)
#  define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
# else
#  define SWIFT_WARN_UNUSED_RESULT 
# endif
#endif
#if !defined(SWIFT_NORETURN)
# if __has_attribute(noreturn)
#  define SWIFT_NORETURN __attribute__((noreturn))
# else
#  define SWIFT_NORETURN 
# endif
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA 
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA 
#endif
#if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA 
#endif
#if !defined(SWIFT_CLASS)
# if __has_attribute(objc_subclassing_restricted)
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif
#if !defined(SWIFT_RESILIENT_CLASS)
# if __has_attribute(objc_class_stub)
#  define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME) __attribute__((objc_class_stub))
#  define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_class_stub)) SWIFT_CLASS_NAMED(SWIFT_NAME)
# else
#  define SWIFT_RESILIENT_CLASS(SWIFT_NAME) SWIFT_CLASS(SWIFT_NAME)
#  define SWIFT_RESILIENT_CLASS_NAMED(SWIFT_NAME) SWIFT_CLASS_NAMED(SWIFT_NAME)
# endif
#endif
#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif
#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER 
# endif
#endif
#if !defined(SWIFT_ENUM_ATTR)
# if __has_attribute(enum_extensibility)
#  define SWIFT_ENUM_ATTR(_extensibility) __attribute__((enum_extensibility(_extensibility)))
# else
#  define SWIFT_ENUM_ATTR(_extensibility) 
# endif
#endif
#if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name, _extensibility) enum _name : _type _name; enum SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
# if __has_feature(generalized_swift_name)
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR(_extensibility) SWIFT_ENUM_EXTRA _name : _type
# else
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME, _extensibility) SWIFT_ENUM(_type, _name, _extensibility)
# endif
#endif
#if !defined(SWIFT_UNAVAILABLE)
# define SWIFT_UNAVAILABLE __attribute__((unavailable))
#endif
#if !defined(SWIFT_UNAVAILABLE_MSG)
# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
#endif
#if !defined(SWIFT_AVAILABILITY)
# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
#endif
#if !defined(SWIFT_WEAK_IMPORT)
# define SWIFT_WEAK_IMPORT __attribute__((weak_import))
#endif
#if !defined(SWIFT_DEPRECATED)
# define SWIFT_DEPRECATED __attribute__((deprecated))
#endif
#if !defined(SWIFT_DEPRECATED_MSG)
# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
#endif
#if !defined(SWIFT_DEPRECATED_OBJC)
# if __has_feature(attribute_diagnose_if_objc)
#  define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
# else
#  define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
# endif
#endif
#if defined(__OBJC__)
#if !defined(IBSegueAction)
# define IBSegueAction 
#endif
#endif
#if !defined(SWIFT_EXTERN)
# if defined(__cplusplus)
#  define SWIFT_EXTERN extern "C"
# else
#  define SWIFT_EXTERN extern
# endif
#endif
#if !defined(SWIFT_CALL)
# define SWIFT_CALL __attribute__((swiftcall))
#endif
#if !defined(SWIFT_INDIRECT_RESULT)
# define SWIFT_INDIRECT_RESULT __attribute__((swift_indirect_result))
#endif
#if !defined(SWIFT_CONTEXT)
# define SWIFT_CONTEXT __attribute__((swift_context))
#endif
#if !defined(SWIFT_ERROR_RESULT)
# define SWIFT_ERROR_RESULT __attribute__((swift_error_result))
#endif
#if defined(__cplusplus)
# define SWIFT_NOEXCEPT noexcept
#else
# define SWIFT_NOEXCEPT 
#endif
#if !defined(SWIFT_C_INLINE_THUNK)
# if __has_attribute(always_inline)
# if __has_attribute(nodebug)
#  define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline)) __attribute__((nodebug))
# else
#  define SWIFT_C_INLINE_THUNK inline __attribute__((always_inline))
# endif
# else
#  define SWIFT_C_INLINE_THUNK inline
# endif
#endif
#if defined(_WIN32)
#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
# define SWIFT_IMPORT_STDLIB_SYMBOL __declspec(dllimport)
#endif
#else
#if !defined(SWIFT_IMPORT_STDLIB_SYMBOL)
# define SWIFT_IMPORT_STDLIB_SYMBOL 
#endif
#endif
#if defined(__OBJC__)
#if __has_feature(objc_modules)
#if __has_warning("-Watimport-in-framework-header")
#pragma clang diagnostic ignored "-Watimport-in-framework-header"
#endif
@import CoreData;
@import Foundation;
@import ObjectiveC;
#endif

#endif
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"
#if __has_warning("-Wpragma-clang-attribute")
# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
#endif
#pragma clang diagnostic ignored "-Wunknown-pragmas"
#pragma clang diagnostic ignored "-Wnullability"
#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"

#if __has_attribute(external_source_symbol)
# pragma push_macro("any")
# undef any
# pragma clang attribute push(__attribute__((external_source_symbol(language="Swift", defined_in="FlybitsSDK",generated_declaration))), apply_to=any(function,enum,objc_interface,objc_category,objc_protocol))
# pragma pop_macro("any")
#endif

#if defined(__OBJC__)

/// The <code>Analytics</code> class is the access point for all Analytics
/// based operations in Flybits. It handles both the storing of
/// logged events which the user calls to be recorded, as well as
/// flushing all stored data.
/// It is required that you first initialize <code>Session</code> with an api key
/// before using this class.
SWIFT_CLASS("_TtC10FlybitsSDK9Analytics") SWIFT_DEPRECATED_MSG("Analytics class will be removed in v4.0")
@interface Analytics : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
/// Sends all queued up events stored on the phone to their appropriate channels.
- (void)flushEvents;
@end

/// Storage type for events
typedef SWIFT_ENUM(NSInteger, StorageType, open) {
/// Uses CoreData for storage
  StorageTypeCoreData = 0,
/// Uses UserDefaults for storage
  StorageTypeMemory = 1,
};


/// UploadServiceTime: The time parameters that describe
/// the manner in which analytics will be sent to the server.
SWIFT_CLASS("_TtCC10FlybitsSDK9Analytics17UploadServiceTime")
@interface UploadServiceTime : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end

@class NSString;
enum RequestMethod : NSInteger;
@class User;

/// The <code>IDP</code> protocol defines Identity Providers (IDP) supported by Flybits.
SWIFT_PROTOCOL("_TtP10FlybitsSDK3IDP_")
@protocol IDP <NSCoding>
/// The Identity Provider name.
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
/// The unique identifier for the Flybits Project that this IDP should connect to.
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
/// The URL Endpoint for the IDP to successfully connect.
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
/// The HTTP(s) POST request body for connecting.
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
@optional
/// The HTTP(s) POST request query parameter(s)
@property (nonatomic, readonly, copy) NSString * _Nullable queryParams;
/// The HTTP(s) Header in case is necessary.
@property (nonatomic, readonly, copy) NSDictionary<NSString *, NSString *> * _Nonnull requestHeaders;
/// The HTTP method in case is necessary to change
@property (nonatomic, readonly) enum RequestMethod requestMethod;
/// Once Authentication works with the provided IDP this method will get triggered only in success scenario.
/// \param user The returned Flybits user object
///
- (void)didAuthenticateWithUser:(User * _Nonnull)user;
@end

@class NSCoder;

/// The <code>AnonymousIDP</code> class is responsible for creating an anonymous Flybits account.
SWIFT_CLASS("_TtC10FlybitsSDK12AnonymousIDP")
@interface AnonymousIDP : NSObject <IDP>
/// The Identity Provider name.
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
/// The unique identifier for the Flybits Project that this IDP should connect to.
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
/// The URL Endpoint for the IDP to successfully connect.
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
/// The HTTP(s) POST request body for connecting.
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
/// NSCoding decode initializer
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder;
/// NSCoding encode
- (void)encodeWithCoder:(NSCoder * _Nonnull)aCoder;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end


@class NSEntityDescription;
@class NSManagedObjectContext;

SWIFT_CLASS_NAMED("Cache")
@interface Cache : NSManagedObject
- (nonnull instancetype)initWithEntity:(NSEntityDescription * _Nonnull)entity insertIntoManagedObjectContext:(NSManagedObjectContext * _Nullable)context OBJC_DESIGNATED_INITIALIZER;
@end

@class NSData;
@class NSDate;

@interface Cache (SWIFT_EXTENSION(FlybitsSDK))
@property (nonatomic, copy) NSData * _Nullable jsonData;
@property (nonatomic, copy) NSDate * _Nullable lastReadAt;
@property (nonatomic, copy) NSDate * _Nullable savedAt;
@property (nonatomic, copy) NSString * _Nullable url;
@end

/// Defines all the error that can be return by FlybitsSDK when the cache layer
/// fails or throws exception
typedef SWIFT_ENUM(NSInteger, CacheError, open) {
/// Token not found
  CacheErrorTokenNotFound = 0,
};
static NSString * _Nonnull const CacheErrorDomain = @"FlybitsSDK.CacheError";


/// A <code>CacheManager</code> useful for any type of FlybitsRequest. It is configurable by an application developer
/// by setting the <code>CachePolicy</code>
SWIFT_CLASS("_TtC10FlybitsSDK12CacheManager") SWIFT_DEPRECATED_MSG("CacheManager class will be removed in v4.0")
@interface CacheManager : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end

/// Defines all the error that can be return by FlybitsSDK when it fails to
/// format server response
typedef SWIFT_ENUM(NSInteger, CocoaError, open) {
/// Formatting error
  CocoaErrorFormattingError = 0,
};
static NSString * _Nonnull const CocoaErrorDomain = @"FlybitsSDK.CocoaError";

/// Error types for <code>Analytics</code> configuration
typedef SWIFT_ENUM(NSInteger, ConfigurationError, open) {
/// Stored events must be flushed before changing storage types.
  ConfigurationErrorHasStoredEvents = 0,
/// API key/Project ID must be set before using Analytics.
  ConfigurationErrorApiKeyNotSet = 1,
};
static NSString * _Nonnull const ConfigurationErrorDomain = @"FlybitsSDK.ConfigurationError";

/// Defines all the error that can be return by FlybitsSDK when the cache store
/// fails or throws exception
typedef SWIFT_ENUM(NSInteger, CoreDataError, open) {
/// Store not found
  CoreDataErrorStoreNotFound = 0,
};
static NSString * _Nonnull const CoreDataErrorDomain = @"FlybitsSDK.CoreDataError";

typedef SWIFT_ENUM(NSInteger, CustomerStatus, open) {
  CustomerStatusUnknown = 0,
  CustomerStatusActiveOptedIn = 1,
  CustomerStatusActiveOptedInExpiredToken = 2,
  CustomerStatusActiveOptedOutExpiredToken = 3,
  CustomerStatusActiveOptedOut = 4,
  CustomerStatusNotActiveOptedIn = 5,
  CustomerStatusNotActiveOptedOut = 6,
};


SWIFT_CLASS("_TtC10FlybitsSDK13DeviceManager")
@interface DeviceManager : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end


/// Defines errors that contains list of other errors. You should inspect the error’s userInfo to see other errors
typedef SWIFT_ENUM(NSInteger, ErrorList, open) {
/// Array
  ErrorListArray = 0,
};
static NSString * _Nonnull const ErrorListDomain = @"FlybitsSDK.ErrorList";


/// The <code>FlyJWT</code> class handles refreshing of token with the Flybits server.
SWIFT_CLASS("_TtC10FlybitsSDK6FlyJWT")
@interface FlyJWT : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

@class FlybitsRequest;

SWIFT_CLASS("_TtC10FlybitsSDK16FlybitsAnalytics")
@interface FlybitsAnalytics : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
+ (FlybitsRequest * _Nullable)sendAnalyticsWithCompletion:(void (^ _Nullable)(NSError * _Nullable))completion;
- (void)encodeWithCoder:(NSCoder * _Nonnull)coder;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder;
@end



/// The <code>FlybitsScope</code> protocol defines an SDK scope that enables or disables various capabilities
/// available through the SDKs.
/// Flybits modular SDKs are responsible for implementing the scope and define available functionality.
SWIFT_PROTOCOL("_TtP10FlybitsSDK12FlybitsScope_")
@protocol FlybitsScope <NSCoding>
@optional
/// Indicates that the scope has been added and appropriate actions
/// can be performed by the SDKs.
/// \param currentActiveUserIsOptedIn Indicates if the current active user is opted in. False if there is no active user.
///
- (void)onStartWithCurrentActiveUserIsOptedIn:(BOOL)currentActiveUserIsOptedIn;
/// Indicates that the scope has been removed and appropriate actions
/// can be performed by the SDKs.
- (void)onStop;
@required
/// Indicates that the connection was successfully made and appropriate actions
/// can be performed by the SDKs.
/// \param user The connected <code>User</code>.
///
- (void)onConnectedWithUser:(User * _Nonnull)user;
/// Indicates that the disconnection was successfully made and appropriate actions
/// can be performed by the SDKs.
- (void)onDisconnectedWithJwtToken:(NSString * _Nonnull)jwtToken;
/// Indicates that the account has been destroyed successfully and appropriate actions
/// can be performed by the SDKs.
- (void)onAccountDestroyedWithJwtToken:(NSString * _Nonnull)jwtToken;
/// Indicates that the account has been opt in successfully and appropriate actions
/// can be performed by the SDKs.
- (void)onOptIn;
/// Indicates that the account has been opt out successfully and appropriate actions
/// can be performed by the SDKs.
- (void)onOptOut;
/// Uniquely identify the scope
@property (nonatomic, readonly, copy) NSString * _Nonnull identifier;
@end


@interface FlybitsAnalytics (SWIFT_EXTENSION(FlybitsSDK)) <FlybitsScope>
@property (nonatomic, readonly, copy) NSString * _Nonnull identifier;
- (void)onStartWithCurrentActiveUserIsOptedIn:(BOOL)currentActiveUserIsOptedIn;
- (void)onStop;
- (void)onConnectedWithUser:(User * _Nonnull)user;
- (void)onDisconnectedWithJwtToken:(NSString * _Nonnull)jwtToken;
- (void)onAccountDestroyedWithJwtToken:(NSString * _Nonnull)jwtToken;
- (void)onOptIn;
- (void)onOptOut;
@end


/// The <code>FlybitsIDP</code> class is responsible for creating or connecting a Flybits user account.
SWIFT_CLASS("_TtC10FlybitsSDK10FlybitsIDP")
@interface FlybitsIDP : NSObject <IDP>
/// Initializer used to register and create a user account for Flybits.
/// \param email The email account for a Flybits user.
///
/// \param password The password for a Flybits user.
///
/// \param firstName The first name of a user.
///
/// \param lastName The last name of a user.
///
/// \param requireAccountActivation Indicates whether users are required to be confirmed before being allowed to access features provided by Flybits. Confirmation can be completed by a user clicking a confirmation link sent to their email address as specified in the registration step. Defaults to false.
///
- (nonnull instancetype)initWithEmail:(NSString * _Nonnull)email password:(NSString * _Nonnull)password firstName:(NSString * _Nonnull)firstName lastName:(NSString * _Nonnull)lastName requireAccountActivation:(BOOL)requireAccountActivation;
/// Initializer used to connect a user account for Flybits.
/// \param email The email account for a Flybits user.
///
/// \param password The password for a Flybits user.
///
/// \param requireAccountActivation Indicates whether users are required to be confirmed before being allowed to access features provided by Flybits. Confirmation can be completed by a user clicking a confirmation link sent to their email address as specified in the registration step. Defaults to false.
///
- (nonnull instancetype)initWithEmail:(NSString * _Nonnull)email password:(NSString * _Nonnull)password requireAccountActivation:(BOOL)requireAccountActivation OBJC_DESIGNATED_INITIALIZER;
/// The Identity Provider name.
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
/// The unique identifier for the Flybits Project that this IDP should connect to.
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
/// The URL Endpoint for the IDP to successfully connect.
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
/// The HTTP(s) POST request body for connecting.
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
/// NSCoding decode initializer
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder;
/// NSCoding encode
- (void)encodeWithCoder:(NSCoder * _Nonnull)aCoder;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end

@class NSError;

/// The <code>FlybitsManager</code> class is a primary integration point for all SDKs
/// and is responsible for defining all <code>FlybitsScope</code>’s as well as
/// performing <code>User</code> operations such as logging in, logging out, disabling account,
/// resetting password and refreshing the JWT token.
SWIFT_CLASS("_TtC10FlybitsSDK14FlybitsManager")
@interface FlybitsManager : NSObject <NSCoding>
/// Gateway URL.
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly, copy) NSString * _Nonnull gatewayURL;)
+ (NSString * _Nonnull)gatewayURL SWIFT_WARN_UNUSED_RESULT;
/// The <code>isConnected</code> method is responsible for checking if the user has already connected.
///
/// returns:
/// A boolean indicating if the user is connected.
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly) BOOL isConnected;)
+ (BOOL)isConnected SWIFT_WARN_UNUSED_RESULT;
/// The <code>currentActiveUserIsOptedIn</code> method is responsible for checking if the current active user is opted in.
///
/// returns:
/// A boolean indicating if the current active user is opted in. If there is no active user, also returns false.
SWIFT_CLASS_PROPERTY(@property (nonatomic, class, readonly) BOOL currentActiveUserIsOptedIn;)
+ (BOOL)currentActiveUserIsOptedIn SWIFT_WARN_UNUSED_RESULT;
/// Default initializer to create <code>FlybitsManager</code>.
/// \param projectID Unique Flybits Project ID.
///
/// \param idProvider Identity Provider to connect.
///
/// \param scopes Flybits Scopes to receive updates.
///
- (nullable instancetype)initWithProjectID:(NSString * _Nullable)projectID idProvider:(id <IDP> _Nonnull)idProvider scopes:(NSArray<id <FlybitsScope>> * _Nonnull)scopes OBJC_DESIGNATED_INITIALIZER SWIFT_DEPRECATED_MSG("Please use static functions to access FlybitsManager");
/// Default initializer to create <code>FlybitsManager</code>.
/// \param projectID Unique Flybits Project ID.
///
/// \param scopes Flybits Scopes to receive updates.
///
/// \param languageCodes Language codes for localizations.
///
- (nonnull instancetype)initWithProjectID:(NSString * _Nullable)projectID scopes:(NSArray<id <FlybitsScope>> * _Nonnull)scopes OBJC_DESIGNATED_INITIALIZER SWIFT_DEPRECATED_MSG("Please use static functions to access FlybitsManager");
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
/// The <code>connect</code> method is responsible for connecting the identity provider to the Flybits.
/// On successful connection, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onConnected</code> method.
/// When using <code>FlybitsIDP</code> and requiring account activation, appropriate error codes gets returned
/// indicating if confirmation email was sent successfully i.e. <code>RegistrationError.confirmationRequired</code>
/// or if error occured when sending confirmation email i.e. <code>RegistrationError.failedSendingConfirmationEmail</code>.
/// \param completion A completion closure that returns the connected <code>User</code> on success or an <code>NSError</code> if failed.
///
/// \param user The returned Flybits user object
///
/// \param error Contains failed authentication result
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
- (FlybitsRequest * _Nonnull)connectWithCompletion:(void (^ _Nonnull)(User * _Nullable, NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("Please use static version of this method", "connect(idp:customerId:projectId:completion:)");
/// The <code>connect</code> method is responsible for connecting the identity provider to the Flybits.
/// On successful connection, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onConnected</code> method.
/// When using <code>FlybitsIDP</code> and requiring account activation, appropriate error codes gets returned
/// indicating if confirmation email was sent successfully i.e. <code>RegistrationError.confirmationRequired</code>
/// or if error occured when sending confirmation email i.e. <code>RegistrationError.failedSendingConfirmationEmail</code>.
/// \param completion A completion closure that returns the connected <code>User</code> on success or an <code>NSError</code> if failed.
///
/// \param idp The authentication object for the user
///
/// \param user The returned Flybits user object
///
/// \param error Contains failed authentication result
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
- (FlybitsRequest * _Nonnull)connectWithIDP:(id <IDP> _Nonnull)idp completion:(void (^ _Nonnull)(User * _Nullable, NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("Please use static version of this method", "connect(idp:customerId:projectId:completion:)");
/// The <code>connect</code> method is responsible for connecting the identity provider to the Flybits.
/// On successful connection, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onConnected</code> method.
/// When using <code>FlybitsIDP</code> and requiring account activation, appropriate error codes gets returned
/// indicating if confirmation email was sent successfully i.e. <code>RegistrationError.confirmationRequired</code>
/// or if error occured when sending confirmation email i.e. <code>RegistrationError.failedSendingConfirmationEmail</code>.
/// \param completion A completion closure that returns the connected <code>User</code> on success or an <code>NSError</code> if failed.
///
/// \param idp The authentication object for the user
///
/// \param user The returned Flybits user object
///
/// \param error Contains failed authentication result
///
/// \param projectId The project to associate with
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
- (FlybitsRequest * _Nonnull)connectWithIDP:(id <IDP> _Nonnull)idp projectId:(NSString * _Nonnull)projectId completion:(void (^ _Nonnull)(User * _Nullable, NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("Please use static version of this method", "connect(idp:customerId:projectId:completion:)");
/// The <code>connect</code> method is responsible for connecting the identity provider to Flybits.
/// On successful connection, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onConnected</code> method.
/// When using <code>FlybitsIDP</code> and requiring account activation, appropriate error codes gets returned
/// indicating if confirmation email was sent successfully i.e. <code>RegistrationError.confirmationRequired</code>
/// or if error occured when sending confirmation email i.e. <code>RegistrationError.failedSendingConfirmationEmail</code>.
/// There is only a single session being persisted at any time. Use the <code>customerId</code> field to help discover which
/// user is currently known by the SDK and if a connect is needed to swap.
/// \param completion A completion closure that returns the connected <code>User</code> on success or an <code>NSError</code> if failed.
///
/// \param user The returned Flybits user object
///
/// \param error Contains failed authentication result
///
/// \param idp The authentication object for the user
///
/// \param customerId An application unique identifier associated with the newly created flybits session.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
- (FlybitsRequest * _Nonnull)connectWithIDP:(id <IDP> _Nonnull)idp customerId:(NSString * _Nullable)customerId completion:(void (^ _Nonnull)(User * _Nullable, NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("Please use static version of this method", "connect(idp:customerId:projectId:completion:)");
/// The <code>connect</code> method is responsible for connecting the identity provider to Flybits.
/// On successful connection, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onConnected</code> method.
/// When using <code>FlybitsIDP</code> and requiring account activation, appropriate error codes gets returned
/// indicating if confirmation email was sent successfully i.e. <code>RegistrationError.confirmationRequired</code>
/// or if error occured when sending confirmation email i.e. <code>RegistrationError.failedSendingConfirmationEmail</code>.
/// There is only a single session being persisted at any time. Use the <code>customerId</code> field to help discover which
/// user is currently known by the SDK and if a connect is needed to swap.
/// \param completion A completion closure that returns the connected <code>User</code> on success or an <code>NSError</code> if failed.
///
/// \param idp The authentication object for the user
///
/// \param user The returned Flybits user object
///
/// \param customerId An application unique identifier associated with the newly created flybits session.
///
/// \param projectId The project to associate with
///
/// \param error Contains failed authentication result
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)connectWithIDP:(id <IDP> _Nonnull)idp customerId:(NSString * _Nullable)customerId projectId:(NSString * _Nullable)projectId completion:(void (^ _Nonnull)(User * _Nullable, NSError * _Nullable))completion;
/// The <code>connect</code> method is responsible for connecting the identity provider to Flybits.
/// On successful connection, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onConnected</code> method.
/// When using <code>FlybitsIDP</code> and requiring account activation, appropriate error codes gets returned
/// indicating if confirmation email was sent successfully i.e. <code>RegistrationError.confirmationRequired</code>
/// or if error occured when sending confirmation email i.e. <code>RegistrationError.failedSendingConfirmationEmail</code>.
/// important:
/// There is only a single session being persisted at any time. Use the <code>customerId</code> field to help discover which
/// user is currently known by the SDK and if a connect is needed to swap.
/// \param completion A completion closure that returns the connected <code>User</code> on success or an <code>NSError</code> if failed.
///
/// \param idp The authentication object for the user
///
/// \param user The returned Flybits user object
///
/// \param customerId An application unique identifier associated with the newly created flybits session.
///
/// \param projectId The project to associate with
///
/// \param physicalDeviceId The custom physical device id to connect to flybits
///
/// \param error Contains failed authentication result
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)connectWithIDP:(id <IDP> _Nonnull)idp customerId:(NSString * _Nullable)customerId projectId:(NSString * _Nullable)projectId physicalDeviceId:(NSString * _Nullable)physicalDeviceId completion:(void (^ _Nonnull)(User * _Nullable, NSError * _Nullable))completion;
/// The <code>disconnect</code> method is responsible for disconnecting and clearing the session with Flybits.
/// On successfully disconnecting, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onDisconnected</code> method.
/// \param completion A completion closure that returns the disconnected JWT token on success
/// or an <code>NSError</code> if failed.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)disconnectWithCompletion:(void (^ _Nonnull)(NSString * _Nullable, NSError * _Nullable))completion;
/// The <code>disconnect</code> method is responsible for disconnecting and clearing the session with Flybits.
/// On successfully disconnecting, all registered <code>FlybitsScope</code>’s gets notified
/// through the <code>onDisconnected</code> method.
/// \param completion A completion closure that returns the disconnected JWT token on success
/// or an <code>NSError</code> if failed.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
- (FlybitsRequest * _Nonnull)disconnectWithCompletion:(void (^ _Nonnull)(NSString * _Nullable, NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT SWIFT_DEPRECATED_MSG("Please use static version of this method", "disconnect(_:completion:)");
+ (void)enableLogging;
/// NSCoding encode
- (void)encodeWithCoder:(NSCoder * _Nonnull)coder;
/// NSCoding decode initializer
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)decoder;
@end


@interface FlybitsManager (SWIFT_EXTENSION(FlybitsSDK))
/// Verify the <code>CustomerStatus</code> of the current user based on the provided customer identification.
/// \param customerId App’s customer identification
///
///
/// returns:
/// The enum <code>CustomerStatus</code> case based on the provided customer identification provided.
+ (enum CustomerStatus)statusFor:(NSString * _Nonnull)customerId SWIFT_WARN_UNUSED_RESULT;
@end


/// The <code>FlybitsPreference</code> class is responsible for storing key-pair values on the Flybits
/// server to act as preferences for the user. These preferences are saved on a per user basis
/// regardless of the device.
SWIFT_CLASS("_TtC10FlybitsSDK17FlybitsPreference")
@interface FlybitsPreference : NSObject
/// Set the object associated to the <code>key</code> parameter. If a user preferences object does not exist already one will be created.
/// \param value The object that will be saved.
///
/// \param forKey The attribute name that the preference is saved under.
///
/// \param completion A completion closure that returns an error if the request fails.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)set:(NSDictionary<NSString *, id> * _Nonnull)value object:(NSString * _Nonnull)key forKey:(void (^ _Nonnull)(NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT;
/// Set the array preference associated to the <code>key</code> parameter. If a user preferences object does not exist already one will be created.
/// \param value The array value that will be saved.
///
/// \param forKey The attribute name that the preference is saved under.
///
/// \param completion A completion closure that returns an error if the request fails.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)set:(NSArray * _Nonnull)value array:(NSString * _Nonnull)key forKey:(void (^ _Nonnull)(NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT;
/// Set the boolean preference associated to the <code>key</code> parameter. If a user preferences object does not exist already one will be created.
/// \param value The boolean value that will be saved.
///
/// \param forKey The attribute name that the preference is saved under.
///
/// \param completion A completion closure that returns an error if the request fails.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)set:(BOOL)value bool:(NSString * _Nonnull)key forKey:(void (^ _Nonnull)(NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT;
/// Set the string preference associated to the <code>key</code> parameter. If a user preferences object does not exist already one will be created.
/// \param value The string value that will be saved.
///
/// \param forKey The attribute name that the preference is saved under.
///
/// \param completion A completion closure that returns an error if the request fails.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)set:(NSString * _Nonnull)value string:(NSString * _Nonnull)key forKey:(void (^ _Nonnull)(NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT;
/// Set the integer preference associated to the <code>key</code> parameter. If a user preferences object does not exist already one will be created.
/// \param value The integer value that will be saved.
///
/// \param forKey The attribute name that the preference is saved under.
///
/// \param completion A completion closure that returns an error if the request fails.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)set:(NSInteger)value int:(NSString * _Nonnull)key forKey:(void (^ _Nonnull)(NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT;
/// Set the double precision floating-point preference associated to the <code>key</code> parameter. If a user preferences object does not exist already one will be created.
/// \param value The double value that will be saved.
///
/// \param forKey The attribute name that the preference is saved under.
///
/// \param completion A completion closure that returns an error if the request fails.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
+ (FlybitsRequest * _Nonnull)set:(double)value double:(NSString * _Nonnull)key forKey:(void (^ _Nonnull)(NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end



@class NSURLRequest;
enum FlybitsRequestType : NSInteger;
@class NSHTTPURLResponse;
@class NSURLResponse;

/// The base Flybits SDKs network request class.
SWIFT_CLASS("_TtC10FlybitsSDK14FlybitsRequest")
@interface FlybitsRequest : NSObject
/// Constructs a new request based on an NSURLRequest.
/// \param request An NSURLRequest object.
///
- (nonnull instancetype)initWithRequest:(NSURLRequest * _Nullable)request requestType:(enum FlybitsRequestType)type isCachable:(BOOL)isCachable error:(NSError * _Nullable)error OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
/// Sets success status code
- (FlybitsRequest * _Nonnull)setHttpSuccessStatusCode:(NSInteger)httpSuccessStatusCode SWIFT_WARN_UNUSED_RESULT;
/// Sets success status code with lower..<upper bounds
- (FlybitsRequest * _Nonnull)setHttpSuccessStatusCodeWithLowerBound:(NSInteger)lower upperBound:(NSInteger)upper SWIFT_WARN_UNUSED_RESULT;
/// Uses Generics to serialize the server’s response into an object of the specified type.
/// \param completion A closure that returns the original request, the response, the serialized object and an error.
///
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
- (nonnull instancetype)responseWithCompletion:(void (^ _Nonnull)(NSURLRequest * _Nullable, NSHTTPURLResponse * _Nullable, NSData * _Nullable, NSError * _Nullable))completion;
/// Uses the <code>uploadTask</code> to place an operation in the OS to be executed later
///
/// returns:
/// A cancellable <code>FlybitsRequest</code> object.
- (nonnull instancetype)uploadTask:(void (^ _Nonnull)(NSData * _Nullable, NSURLResponse * _Nullable, NSError * _Nullable))completion SWIFT_WARN_UNUSED_RESULT;
@end


/// The base Flybits SDK network request list class that handles multiple requests.
SWIFT_CLASS("_TtC10FlybitsSDK18FlybitsRequestList")
@interface FlybitsRequestList : FlybitsRequest
/// Default initializer
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)initWithRequest:(NSURLRequest * _Nullable)request requestType:(enum FlybitsRequestType)type isCachable:(BOOL)isCachable error:(NSError * _Nullable)error SWIFT_UNAVAILABLE;
@end

/// A list of possible request types for a Requestable.
typedef SWIFT_ENUM(NSInteger, FlybitsRequestType, open) {
/// A core request (inherent to Flybits core, i.e. <code>Content</code>, <code>User</code>)
  FlybitsRequestTypeGateway = 0,
/// A rule request (<code>Rule</code> based requests)
  FlybitsRequestTypeRules = 1,
/// A context data update request
  FlybitsRequestTypeContextUpdate = 2,
/// A push request (<code>APNS</code> and <code>MQTT</code> based requests)
  FlybitsRequestTypePush = 3,
/// A custom request
  FlybitsRequestTypeCustom = 4,
};





/// Defines errors that can occur when fetching a new JWT.
typedef SWIFT_ENUM(NSInteger, JWTError, open) {
/// Max retries
  JWTErrorMaxRetries = 0,
};
static NSString * _Nonnull const JWTErrorDomain = @"FlybitsSDK.JWTError";


/// The <code>JwtIDP</code> class is responsible for creating a specific Identity Provider (IDP) that
/// can be logged into using the Flybits Token.
SWIFT_CLASS("_TtC10FlybitsSDK6JwtIDP")
@interface JwtIDP : NSObject <IDP>
/// The unique identifier for the Flybits Project that this IDP should connect to.
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
/// The URL Endpoint for the IDP to successfully connect.
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
/// The Request Headers in case any header is necessary to be inserted
@property (nonatomic, readonly, copy) NSDictionary<NSString *, NSString *> * _Nonnull requestHeaders;
/// Which HTTP method should be used
@property (nonatomic, readonly) enum RequestMethod requestMethod;
- (void)didAuthenticateWithUser:(User * _Nonnull)user;
/// NSCoding decode initializer
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder;
/// NSCoding encode
- (void)encodeWithCoder:(NSCoder * _Nonnull)aCoder;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end


/// The <code>JwtLoginIDP</code> class is responsible for creating an JWT based signed login idnentifier provider (IDP).
/// Using this IDP for customer that need JWT based signed Login indentifier.
/// By using this IDP, customer need to provide a signed JWT.
SWIFT_CLASS("_TtC10FlybitsSDK11JwtLoginIDP")
@interface JwtLoginIDP : NSObject <IDP>
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
/// Request header need to use jwt signed token
@property (nonatomic, readonly, copy) NSDictionary<NSString *, NSString *> * _Nonnull requestHeaders;
@property (nonatomic, readonly) enum RequestMethod requestMethod;
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
- (void)encodeWithCoder:(NSCoder * _Nonnull)coder;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)coder;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end

/// Defines errors that can occur during localization changes
typedef SWIFT_ENUM(NSInteger, LocalizationError, open) {
/// Unknown language code
  LocalizationErrorUnknownLanguageCode = 0,
/// Invalid format
  LocalizationErrorInvalidFormat = 1,
};
static NSString * _Nonnull const LocalizationErrorDomain = @"FlybitsSDK.LocalizationError";

/// Defines some of the error that can be return by Flybits for login related
/// issues. You might get any of those (SessionError, NetworkingRequestError,
/// CoreDataError, etc) as well as LoginError. <code>NSError.userInfo</code> will
/// tell you what data is missing or invalid.
typedef SWIFT_ENUM(NSInteger, LoginError, open) {
/// Missing field/property that is expected to be there for API to function
  LoginErrorMissingRequiredData = 0,
/// Invalid data is being sent for a property – i.e., sending email not in
/// the correct format, i.e., user@flybits,com (notice the comma).
  LoginErrorInvalidData = 1,
/// User already connected. Disconnect before connecting again.
  LoginErrorAlreadyConnected = 2,
/// No user connected. Connect before disconnecting again.
  LoginErrorNotConnected = 3,
};
static NSString * _Nonnull const LoginErrorDomain = @"FlybitsSDK.LoginError";



/// A structure containing many constants used internally in the SDK
SWIFT_CLASS("_TtC10FlybitsSDK7Network")
@interface Network : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end

/// Defines all the error that can be return by FlybitsSDK when request fails
/// for network reason, or internal server issues.
/// Note: NetworkingRequestError.FlybitsUnavailable is used as ‘Kill Switch’
typedef SWIFT_ENUM(NSInteger, NetworkingRequestError, open) {
/// Returned data is not the expected format
  NetworkingRequestErrorUnableToParseResponse = 0,
/// Request made is invalid
  NetworkingRequestErrorInvalidRequest = 400,
/// Kill switch – Flybits is deactivated on purpose
  NetworkingRequestErrorFlybitsUnavailable = 503,
/// You do not have access to call the API – may ProjectID is wrong?
  NetworkingRequestErrorUnauthorized = 401,
/// You do not have access to call the API – Are you logged out?
  NetworkingRequestErrorForbidden = 403,
/// Resource is not found – Invalid data is being post to server? or getting from server?
  NetworkingRequestErrorNotFound = 404,
/// Indicates that the application has exceeded its API usage limit for the project.
  NetworkingRequestErrorApiUsageExceeded = 429,
/// Posting data is empty
  NetworkingRequestErrorEmptyData = 430,
/// By default all http request is expected to be between 200 ..< 300 (HTTP success range)
  NetworkingRequestErrorExpectationNotMet = 431,
};
static NSString * _Nonnull const NetworkingRequestErrorDomain = @"FlybitsSDK.NetworkingRequestError";


/// The <code>OAuthIDP</code> class is responsible for creating a specific Identity Provider (IDP) that
/// is managed by a OAuth based 3rd party integration such Facebook or Google.
SWIFT_CLASS("_TtC10FlybitsSDK8OAuthIDP")
@interface OAuthIDP : NSObject <IDP>
/// The Identity Provider name.
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
/// The unique identifier for the Flybits Project that this IDP should connect to.
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
/// The URL Endpoint for the IDP to successfully connect.
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
/// The HTTP(s) POST request body for connecting.
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
/// NSCoding decode initializer
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder;
/// NSCoding encode
- (void)encodeWithCoder:(NSCoder * _Nonnull)aCoder;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end

typedef SWIFT_ENUM(NSInteger, SupportedIDP, open) {
/// Facebook OAuth
  SupportedIDPFacebook = 0,
/// Google OAuth
  SupportedIDPGoogle = 1,
/// Okta OAuth
  SupportedIDPOkta = 2,
};


/// The <code>OpenIDP</code> class is responsible for creating a specific Identity Provider (IDP) that
/// can be logged into using the Open ID connect protocol.
SWIFT_CLASS("_TtC10FlybitsSDK7OpenIDP")
@interface OpenIDP : NSObject <IDP>
/// The Identity Provider name.
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
/// The unique identifier for the Flybits Project that this IDP should connect to.
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
/// The URL Endpoint for the IDP to successfully connect.
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
/// The HTTP(s) POST request body for connecting.
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
/// NSCoding decode initializer
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder;
/// NSCoding encode
- (void)encodeWithCoder:(NSCoder * _Nonnull)aCoder;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end


SWIFT_CLASS("_TtC10FlybitsSDK9Operation")
@interface Operation : NSOperation
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (void)observeValueForKeyPath:(NSString * _Nullable)keyPath ofObject:(id _Nullable)object change:(NSDictionary<NSKeyValueChangeKey, id> * _Nullable)change context:(void * _Nullable)context;
@property (nonatomic, readonly, getter=isReady) BOOL ready;
@property (nonatomic, readonly, getter=isExecuting) BOOL executing;
@property (nonatomic, readonly, getter=isFinished) BOOL finished;
@property (nonatomic, readonly, getter=isCancelled) BOOL cancelled;
- (void)addDependency:(NSOperation * _Nonnull)operation;
- (void)main;
- (void)cancel;
- (void)waitUntilFinished;
@end

enum FlybitsUtilitiesSortBy : NSInteger;
enum FlybitsUtilitiesSortOrder : NSInteger;

/// If there are lot of items to be returned, for performance reason, pagination should be used. Even if you do not indicate pagination, response might be paginated.
/// By setting <code>limit</code> and <code>offset</code>, you can retrieve different “pages” of data. For example, you might want to display first 20 items (experiences/content/etc). So, by using pagination as shown below, you will receive the first 20 items.
/// \code
/// // First 20 items or first page with 20 items
/// let pager = Pager(limit:20, offset:0)
///
/// \endcodeTo get the next page or next 20 items:
/// \code
/// // Second 20 items or second page with 20 items
/// let pager = Pager(limit:20, offset:20)
///
/// \endcode
SWIFT_CLASS("_TtC10FlybitsSDK5Pager")
@interface Pager : NSObject
- (nonnull instancetype)initWithLimit:(NSUInteger)limit offset:(NSUInteger)offset totalRecords:(NSUInteger)totalRecords sortBy:(enum FlybitsUtilitiesSortBy)sortBy sortOrder:(enum FlybitsUtilitiesSortOrder)sortOrder OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end



/// The <code>Project</code> class represents a specific project information
/// for a registered project with Flybits.
SWIFT_CLASS("_TtC10FlybitsSDK7Project")
@interface Project : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end


SWIFT_CLASS("_TtC10FlybitsSDK10Properties") SWIFT_DEPRECATED_MSG("Properties class will be removed in v4.0")
@interface Properties : NSObject <NSCoding>
- (void)encodeWithCoder:(NSCoder * _Nonnull)coder;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)decoder OBJC_DESIGNATED_INITIALIZER;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end


SWIFT_CLASS("_TtC10FlybitsSDK16PushSubscription")
@interface PushSubscription : NSObject
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end



SWIFT_CLASS("_TtC10FlybitsSDK5Query")
@interface Query : NSObject
/// Override to pretty-print the <code>Query</code>’s debug description.
@property (nonatomic, readonly, copy) NSString * _Nonnull debugDescription;
/// Override to pretty-print the <code>Query</code>’s description.
@property (nonatomic, readonly, copy) NSString * _Nonnull description;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end

/// Defines errors that can occur when creating query to fetch data from server.
typedef SWIFT_ENUM(NSInteger, QueryExpressionError, open) {
/// Not supported
  QueryExpressionErrorUnsupported = 0,
};
static NSString * _Nonnull const QueryExpressionErrorDomain = @"FlybitsSDK.QueryExpressionError";

/// Defines some of the error that can be return by Flybits when registered
/// new user. You might get any of those (SessionError, NetworkingRequestError,
/// CoreDataError, etc) as well as RegistrationError. <code>NSError.userInfo</code> will
/// tell you what data is missing or invalid.
typedef SWIFT_ENUM(NSInteger, RegistrationError, open) {
/// Missing field/property that is expected to be there for API to function
  RegistrationErrorMissingRequiredData = 0,
/// Invalid data is being sent for a property – i.e., sending email not in
/// the correct format, i.e., user@flybits,com (notice the comma).
  RegistrationErrorInvalidData = 1,
/// The server failed to send a confirmation email.
  RegistrationErrorFailedSendingConfirmationEmail = 2,
/// The user tried logging in but is still required to click the
/// confirmation link in their email.
  RegistrationErrorConfirmationRequired = 3,
};
static NSString * _Nonnull const RegistrationErrorDomain = @"FlybitsSDK.RegistrationError";

typedef SWIFT_ENUM(NSInteger, RequestMethod, open) {
/// HTTP GET.
  RequestMethodGET = 0,
/// HTTP POST.
  RequestMethodPOST = 1,
/// HTTP PUT.
  RequestMethodPUT = 2,
/// HTTP DELETE.
  RequestMethodDELETE = 3,
};


/// The <code>SharedElements</code> class is responsible for managing various session based information
/// that can be shared across Flybits SDKs.
SWIFT_CLASS("_TtC10FlybitsSDK14SharedElements")
@interface SharedElements : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end



/// The <code>SignedIDP</code> class is responsible for creating a specific Identity Provider (IDP) that
/// can be logged into using the SAML protocol.
SWIFT_CLASS("_TtC10FlybitsSDK9SignedIDP")
@interface SignedIDP : NSObject <IDP>
/// The Identity Provider name.
@property (nonatomic, readonly, copy) NSString * _Nonnull provider;
/// The unique identifier for the Flybits Project that this IDP should connect to.
@property (nonatomic, readonly, copy) NSString * _Nullable projectID;
/// The URL Endpoint for the IDP to successfully connect.
@property (nonatomic, readonly, copy) NSString * _Nonnull authenticationEndPoint;
/// The HTTP(s) POST request body for connecting.
@property (nonatomic, readonly, copy) NSString * _Nonnull requestBody;
/// NSCoding decode initializer
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder;
/// NSCoding encode
- (void)encodeWithCoder:(NSCoder * _Nonnull)aCoder;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end

/// Defines errors that can occur when using toDictionary.
typedef SWIFT_ENUM(NSInteger, ToDictionaryError, open) {
/// Invalid Coordinate
  ToDictionaryErrorInvalidCoordinate = 0,
/// Invalid Dictionary
  ToDictionaryErrorInvalidDictionary = 1,
};
static NSString * _Nonnull const ToDictionaryErrorDomain = @"FlybitsSDK.ToDictionaryError";


/// The <code>User</code> class represents a specific user and is used to store information
/// about a person who has registered an account with Flybits.
SWIFT_CLASS("_TtC10FlybitsSDK4User")
@interface User : NSObject
/// Compares two <code>User</code>s for equality.
/// \param object Another <code>User</code> (<code>NSObject.isEqual()</code> is used if object is not a <code>User</code>).
///
///
/// returns:
/// <code>true</code> if two <code>User</code>s have the same <code>id</code>, <code>false</code> otherwise.
- (BOOL)isEqual:(id _Nullable)object SWIFT_WARN_UNUSED_RESULT;
/// The <code>User</code>’s hash value (used when treated as an <code>NSObject</code>).
@property (nonatomic, readonly) NSUInteger hash;
- (nonnull instancetype)init SWIFT_UNAVAILABLE;
+ (nonnull instancetype)new SWIFT_UNAVAILABLE_MSG("-init is unavailable");
@end


/// A set of utilities to access common iOS properties.
SWIFT_CLASS_NAMED("Utilities")
@interface FlybitsUtilities : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end


@interface FlybitsUtilities (SWIFT_EXTENSION(FlybitsSDK))
@end

/// Sort order allows to sort Content based on different fields.
typedef SWIFT_ENUM_NAMED(NSInteger, FlybitsUtilitiesSortOrder, "SortOrder", open) {
/// Results should be sorted in <code>Ascending</code> order
  FlybitsUtilitiesSortOrderAscending = 0,
/// Results should be sorted in <code>Descending</code> order
  FlybitsUtilitiesSortOrderDescending = 1,
};

/// Sort by allows to sort and order Content based on different fields.
typedef SWIFT_ENUM_NAMED(NSInteger, FlybitsUtilitiesSortBy, "SortBy", open) {
/// Results should be ordered by Content’s priority index
  FlybitsUtilitiesSortByPriority = 0,
/// Results should be ordered by the time the Content associated rule was last evaluated
  FlybitsUtilitiesSortByEvaluatedAt = 1,
/// Results should be ordered by the time the Content was created
  FlybitsUtilitiesSortByCreatedAt = 2,
/// Results should be ordered by the time the Content was last modified
  FlybitsUtilitiesSortByModifiedAt = 3,
};

/// Length units
typedef SWIFT_ENUM_NAMED(NSInteger, FlybitsUtilitiesLengthUnit, "LengthUnit", open) {
/// Units in meters
  FlybitsUtilitiesLengthUnitMeters = 0,
/// Units in miles
  FlybitsUtilitiesLengthUnitMiles = 1,
/// Units in kilometers
  FlybitsUtilitiesLengthUnitKilometers = 2,
/// Units in yards
  FlybitsUtilitiesLengthUnitYards = 3,
/// Units in feet
  FlybitsUtilitiesLengthUnitFeet = 4,
};

/// Time units
typedef SWIFT_ENUM_NAMED(NSInteger, FlybitsUtilitiesTimeUnit, "TimeUnit", open) {
/// Seconds unit
  FlybitsUtilitiesTimeUnitSeconds = 1,
/// Minutes unit
  FlybitsUtilitiesTimeUnitMinutes = 60,
/// Hours unit
  FlybitsUtilitiesTimeUnitHours = 3600,
/// Days unit
  FlybitsUtilitiesTimeUnitDays = 86400,
};

#endif
#if __has_attribute(external_source_symbol)
# pragma clang attribute pop
#endif
#if defined(__cplusplus)
#endif
#pragma clang diagnostic pop
#endif

#else
#error unsupported Swift architecture
#endif
