#import "AppgainSDK.h"

#import <Appgain/Appgain.h>

@implementation AppgainSDK : NSObject

RCT_EXPORT_MODULE()

//MARK : init sdk in app
//parameter :-
// appId (String)
// apiKey (String)
// configure (Bool)

// Output : -  callback with two parameter
///   response  as stringfvfenableReciveNotification
///    info dictionary
RCT_EXPORT_METHOD(initAppgainSDK:(NSString *) projectId apiKey:(NSString *) apiKey autoconfig: (BOOL) autoconfig  successCallback: (RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback)
{
    
    [Appgain initialize:projectId apiKey:apiKey trackUserForAdvertising:autoconfig whenFinish:^(NSURLResponse * response, NSMutableDictionary * info, NSError* error ) {
        dispatch_async(dispatch_get_main_queue(), ^{
            
            if (response == nil && info == nil && error == nil) {
                successCallback(@[[self getJsonString:@{@"":@""}]]);

            }
            else if (error != nil ){
                errorCallback(error);
            }
            else{
               
                        successCallback(@[ [self getJsonString:info]]);

            }
            
        });
    }];
    
}

//Getting userID
//Output  : - callback with userID

RCT_EXPORT_METHOD(getuserId : (RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSDictionary *details = @{@"userId":[Appgain getUserID]};

        successCallback(@[[self getJsonString:details]]);
    });

}
// MARK: create smartLink
// Input Parameter
//header (String)
//imageUrl (String)
//linkDescription (String)
//linkName (String)
//slug (String)
//iosPrimary (String)  url string for ios
//iosFallback (String) url string
//AndroidPrimary (String)  url string for android
//AndroidFallback (String)  url string for
//webPrimary (String)  url string for web
//weballback (String)  url string for

// Output : -  callback with two parameter
///   response  as string
///    info dictionary

RCT_EXPORT_METHOD(createSmartLinkWith :(NSString *) header withImage :(NSString *) imageUrl andLinkDesc :(NSString *) linkDescription andLinkName :(NSString *) linkName andSlug:(NSString *) slug forIosTarget :(NSString *)iosPrimary and:(NSString *)iosFallback  forAndroidTarget :(NSString *)AndroidPrimary and:(NSString *)AndroidFallback forWebTarget :(NSString *)webPrimary and:(NSString *)weballback successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback )
{
    
    TargetPlatform *iosTarget = [[TargetPlatform alloc] initWithPrimary:iosPrimary withFallBack:iosFallback];
    TargetPlatform *androidTarget = [[TargetPlatform alloc] initWithPrimary:AndroidPrimary  withFallBack:AndroidFallback];
    TargetPlatform *webTarget = [[TargetPlatform alloc] initWithPrimary:webPrimary  withFallBack:weballback];


    SmartDeepLink *smartObject = [[SmartDeepLink alloc] initWithHeader:header andImage:imageUrl andDescription:linkDescription andName:linkName iosTarget:iosTarget androidTarget:androidTarget webTarget:webTarget];

    [Appgain createSmartLink:smartObject  whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError* error) {
         dispatch_async(dispatch_get_main_queue(), ^{
                   
                   if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                   }
                   else if (error != nil ){
                       errorCallback(error);
                   }
                   else{
                    
                                successCallback(@[ [self getJsonString:info]]);

                   }
                   
               });
    }];
}

//MARK: create match link

// INPUT userID (String) or empty string

// Output : -  callback with two parameter
///   response  as string
///    info dictionary


RCT_EXPORT_METHOD(matchLink: (RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback)
{
    [Appgain matchLink:^(NSURLResponse *response, NSMutableDictionary *info, NSError* error) {
         dispatch_async(dispatch_get_main_queue(), ^{
                  
                  if (response == nil && info == nil && error == nil) {
                      successCallback(@[[self getJsonString:@{@"":@""}]]);

                  }
                  else if (error != nil ){
                      errorCallback(error);
                  }
                  else{
                     
                          successCallback(@[ [self getJsonString:info]]);

                  }
                  
              });
    }];
}


//MARK: create landing page
//INput (String)
//header (String)
//LogoUrl (String)
//paragraph (String)
//buttons
//button is array of follow dictionary
//["title":"","iosUrlTarget":"","androidUrlTarget":"","webUrlTarget": ""]

//sliderImagesUrls
//Array of images urls strings.
//socialMediaSetting  typy of dict
//["title" : "", "mediaDescription":"", "imageUrl":""]

//lang (String)
//subscription (String)
//imageUrl (String)
//label (String)
//slug (String)

// Output : -  callback with two parameter
///   response  as string
///    info dictionary


RCT_EXPORT_METHOD(createLandingPageWith :(NSString *) header logo :(NSString *) LogoUrl andParagraph :(NSString *) paragraph andButtons : (NSArray *) buttons  andSliderImages :(NSArray *) sliderImagesUrls andSocialMediaSetting :(NSDictionary *) socialMediaSetting  andLang:(NSString *) lang forWebPushSubscription :(NSString *)subscription withDefaultImageUrl:(NSString *)imageUrl  andLabel :(NSString *)label andSlug:(NSString *)slug successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback )
{
    
   NSMutableArray *buttonObjects = [NSMutableArray new];
    for (NSMutableDictionary *item in buttons) {
        MobileLandingPageButton *tempObj = [[MobileLandingPageButton alloc] initWithTitle:[item objectForKey:@"title"] iosTarget:[item objectForKey:@"iosUrlTarget"] andAndroid: [item objectForKey:@"androidUrlTarget"] andWeb:[item objectForKey:@"webUrlTarget"]];
        [buttonObjects addObject: tempObj];
    }
    SocialmediaSettings * socailTemp = [[SocialmediaSettings alloc] initWithTitle:[socialMediaSetting objectForKey:@"title"] andDescription:[socialMediaSetting objectForKey:@"mediaDescription"] andImage:[socialMediaSetting objectForKey:@"imageUrl"]];

    MobileLandingPage *tempPage = [[MobileLandingPage alloc] initWithLogo:LogoUrl andHeader:header andParagraph:paragraph withSliderUrlImages:sliderImagesUrls andButtons:buttonObjects andSocialMediaSetting:socailTemp language:lang andSubscription:subscription andimage:imageUrl andlabel:label];

    [Appgain createLandingPage:tempPage  whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError* error) {
             dispatch_async(dispatch_get_main_queue(), ^{
                      
                      if (response == nil && info == nil && error == nil) {
                            successCallback(@[[self getJsonString:@{@"":@""}]]);

                      }
                      else if (error != nil ){
                          errorCallback(error);
                      }
                      else{
                          
                            successCallback(@[ [self getJsonString:info]]);

                         
                      }
                      
                  });
    }];
}

//MARK: create automator

//trigger (String)
//userId (String)
 
// Output : -  callback with two parameter
///   response  as string
///    info dictionary




RCT_EXPORT_METHOD(fireAutomatorWithPersonalization :(NSString *) triggerPointName   successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback )
{
    [Appgain fireAutomator:triggerPointName personalizationData: nil whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError* error) {
       dispatch_async(dispatch_get_main_queue(), ^{
                   
                   if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                   }
                   else if (error != nil ){
                       errorCallback(error);
                   }
                   else{
                       
                           successCallback(@[ [self getJsonString:info]]);
                       
                   }
                   
               });

    }];
}

//MARK: create automator with exta parameter

//trigger (String)
//userId (String)
 //parameters Dictionary of key and value

// Output : -  callback with two parameter
///   response  as string
///    info dictionary



RCT_EXPORT_METHOD(fireAutomator :(NSString *) triggerPointName  personalizationMap:(id) personalizationMap successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback)
{
    [Appgain fireAutomator:triggerPointName personalizationData:personalizationMap whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError* error) {
        dispatch_async(dispatch_get_main_queue(), ^{
                  
                  if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                      
                  }
                  else if (error != nil ){
                      errorCallback(error);
                  }
                  else{
                      
                          successCallback(@[ [self getJsonString:info]]);
                      
                  }
                  
              });

    }];
}


//MARK: update user id

//userId (String)
 //parameters Dictionary of key and value

RCT_EXPORT_METHOD(setuserId  :(NSString *) userId  successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback)
{
    [Appgain updateUserId:userId];
    dispatch_async(dispatch_get_main_queue(), ^{
        successCallback(@[[self getJsonString:@{@"":@""}]]);

    });
}


//MARK: logPurchaseForItem

//productName (String)
//currency (String)
//amount (String)


// Output : -  callback with two parameter
///   success bool   as string
///     error



RCT_EXPORT_METHOD(addPurchase :(NSString *) productName curruncy :(NSString *) curruncy amount:(NSInteger) amount  successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback )
{


    [Appgain logPurchase:productName withAmount:(double)amount forCurrency:curruncy whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
                  
                  if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                      
                  }
                  else if (error != nil ){
                      errorCallback(error);
                  }
                  else{
                      
                          successCallback(@[ [self getJsonString:info]]);
                      
                  }
                  
              });
    }];
}

//MARK: enableReciveNotification

//enable (String)
//type (String) one of theses values ("appPush","sms","email","webPush")


// Output : -  callback with two parameter
///   success bool   as string
///     error



RCT_EXPORT_METHOD(enableReciveNotification :(BOOL) enable forType :(NSString*) type   successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback )
{
    [Appgain enableNotifications:enable forType:type whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
                  
                  if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                      
                  }
                  else if (error != nil ){
                      errorCallback(error);
                  }
                  else{
                      
                          successCallback(@[ [self getJsonString:info]]);
                      
                  }
                  
              });
    }];
   
}



//MARK: createNotificationChannelForType

//item (String)
//notificationType (String) one of theses values ("appPush","sms","email","webPush")


// Output : -  callback with two parameter
///   success bool   as string
///     error




RCT_EXPORT_METHOD(addNotificationChannel :(NSString *) notificationType item :(NSString*) item successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback)
{
    [Appgain createNotificationChannel:notificationType withData:item whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
                  
                  if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                      
                  }
                  else if (error != nil ){
                      errorCallback(error);
                  }
                  else{
                      
                          successCallback(@[ [self getJsonString:info]]);
                      
                  }
                  
              });
    }];
  
}

//MARK: update user profile
//userData (Disct)

// Output : -  callback with two parameter
///   success bool   as string
///     error


RCT_EXPORT_METHOD(updateUserData :(NSDictionary*) userData successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback )
{
    
    [Appgain updateUserData:userData whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
                  
                  if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                      
                  }
                  else if (error != nil ){
                      errorCallback(error);
                  }
                  else{
                      
                          successCallback(@[ [self getJsonString:info]]);
                      
                  }
                  
              });
    }];
   
}

//MARK: log event
//type (String)
//action (String)

// Output : -  callback with two parameter
///   response  as string
///    info dictionary

RCT_EXPORT_METHOD(logEvent :(NSString *) type action :(NSString*) action extras :(NSDictionary*) extras successCallback:(RCTResponseSenderBlock)successCallback  errorCallback: (RCTResponseErrorBlock)errorCallback)
{
    [Appgain logEvent:action andAction:type extras:extras whenFinish:^(NSURLResponse *response, NSMutableDictionary *info, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
                  
                  if (response == nil && info == nil && error == nil) {
                        successCallback(@[[self getJsonString:@{@"":@""}]]);

                      
                  }
                  else if (error != nil ){
                      errorCallback(error);
                  }
                  else{
                      
                          successCallback(@[ [self getJsonString:info]]);
                      
                  }
                  
              });
    }];

}


-(NSString*)getJsonString :(NSDictionary*)info{
    
    if (info != nil){
    NSError * err;
    NSData * jsonData = [NSJSONSerialization dataWithJSONObject:info options:0 error:&err];
    NSString * myString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    return myString;
    }
    else{
      return @"result:success";
    }
}

@end
