#import <Foundation/Foundation.h>

#import <SGSBase/SGSBase.h>
#import <SGSView/SGSView.h>

#import "ViewNativeInterface.h"

// MARK: - Extern APIs

void stove_view_fetchPopup(const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSView fetchPopupWithCompletionHandler:^(SGSResult * _Nonnull result, NSArray<SGSViewRequest *> * _Nullable viewRequests) {
        
        NSMutableArray *mutableViewRequests = [NSMutableArray array];
        for (SGSViewRequest *viewRequest in viewRequests) {
            [mutableViewRequests addObject:[viewRequest dictionary]];
        }
        
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   mutableViewRequests, @"viewRequests",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_fetchPopupWithLocation(int location, const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSView fetchPopupWithLocation:location completionHandler:^(SGSResult * _Nonnull result, NSArray<SGSViewRequest *> * _Nullable viewRequests) {
        
        NSMutableArray *mutableViewRequests = [NSMutableArray array];
        for (SGSViewRequest *viewRequest in viewRequests) {
            [mutableViewRequests addObject:[viewRequest dictionary]];
        }
        
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   mutableViewRequests, @"viewRequests",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_fetchNews(const char *identifier)
{
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSView fetchNewsWithCompletionHandler:^(SGSResult * _Nonnull result, NSArray<SGSViewRequest *> * _Nullable viewRequests) {
        
        NSMutableArray *mutableViewRequests = [NSMutableArray array];
        for (SGSViewRequest *viewRequest in viewRequests) {
            [mutableViewRequests addObject:[viewRequest dictionary]];
        }
        
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   mutableViewRequests, @"viewRequests",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_useCoupon(const char *code, const char *identifier)
{
    NSString *nsCode = StoveSDKMakeNSString(code);
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSView useCouponCode:nsCode completionHandler:^(SGSResult * _Nonnull result) {
        
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_news(const char *identifier)
{
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSViewUI newsWithFromViewController:nil
                        completionHandler:^(SGSResult * _Nonnull result, NSDictionary * _Nullable userInfo) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   userInfo, @"userInfo",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_customerSupport(const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSViewUI customerSupportWithFromViewController:nil
                                   completionHandler:^(SGSResult * _Nonnull result, NSDictionary * _Nullable userInfo) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   userInfo, @"userInfo",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_popup(const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSViewUI popupWithFromViewController:nil
                         completionHandler:^(SGSResult * _Nonnull result, NSDictionary * _Nullable userInfo) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   userInfo, @"userInfo",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_popupWithLocation(int location, const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSViewUI popupWithLocation:location
              fromViewController:nil
               completionHandler:^(SGSResult * _Nonnull result, NSDictionary * _Nullable userInfo) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   userInfo, @"userInfo",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_community(const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSViewUI communityWithFromViewController:nil
                             completionHandler:^(SGSResult * _Nonnull result, NSDictionary * _Nullable userInfo) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   userInfo, @"userInfo",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_community_url(const char *url, const char *identifier) {
    NSString *nsURL = StoveSDKMakeNSString(url);
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSViewUI communityWithURL:nsURL
             fromViewController:nil
              completionHandler:^(SGSResult * _Nonnull result, NSDictionary * _Nullable userInfo) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   userInfo, @"userInfo",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}


void stove_view_load(const char *viewRequest, const char *identifier) {
    NSString *nsViewRequest = StoveSDKMakeNSString(viewRequest);
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    SGSViewRequest *viewRequestObject = [SGSViewRequest requestWithDictionary:[nsViewRequest JSONObject]];
    
    [SGSViewUI loadWithViewRequest:viewRequestObject fromViewController:nil completionHandler:^(SGSResult * _Nonnull result, NSDictionary * _Nullable userInfo) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   userInfo, @"userInfo",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_view_openExternalUrl(const char *url, const char *identifier) {
    NSString *nsURL = StoveSDKMakeNSString(url);
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSView openExternalBrowserWithURL:nsURL completionHandler:^(SGSResult * _Nonnull result) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

const char *stove_view_version() {
    NSString * version = [SGSView moduleVersion];
    return StoveSDKMakeCString(version);
}
