#import <Foundation/Foundation.h>

#import <SGSBase/SGSBase.h>
#import <SGSAuth/SGSAuth.h>
#import <SGSAuthUI/SGSAuthUI.h>

#import "AuthUINativeInterface.h"

// MARK: - Extern APIs

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

void stove_authui_setProviders(const char *list) {
    NSString *nsList = StoveSDKMakeNSString(list);
    
    NSArray *classNameList = [nsList JSONObject];
    
    NSMutableArray *providers = [NSMutableArray array];
    for (NSString *className in classNameList) {
        Class providerClass = NSClassFromString(className);
        id object = [[providerClass alloc] init];
        
        [providers addObject:object];
    }
    
    [SGSAuthUI setProviders:providers];
}

void stove_authui_handleResult(const char *result, const char *identifier) {
    NSString *nsResult = StoveSDKMakeNSString(result);
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    SGSResult *resultObject = [SGSResult resultWithDictionary:[nsResult JSONObject]];
    [SGSOperationUI handleResult:resultObject fromViewController:nil completionHandler:^(SGSResult * _Nonnull result) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_authui_agree(const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSTermsOfServiceUI agreeWithFromViewController:nil completionHandler:^(SGSResult * _Nonnull result, NSArray<SGSTermsOfServiceData *> * _Nullable agreedTermsOfServiceData) {
        
        NSMutableArray *agreedTermsOfServiceDataList = [NSMutableArray array];
        for (SGSTermsOfServiceData *termsOfServiceData in agreedTermsOfServiceData) {
            [agreedTermsOfServiceDataList addObject:[termsOfServiceData dictionary]];
        }
        
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   agreedTermsOfServiceDataList, @"termsOfServiceDataList",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_authui_agreeForRegister(const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSTermsOfServiceUI agreeForRegisterWithFromViewController:nil completionHandler:^(SGSResult * _Nonnull result, NSArray<SGSTermsOfServiceData *> * _Nullable agreedTermsOfServiceData) {
        
        NSMutableArray *agreedTermsOfServiceDataList = [NSMutableArray array];
        for (SGSTermsOfServiceData *termsOfServiceData in agreedTermsOfServiceData) {
            [agreedTermsOfServiceDataList addObject:[termsOfServiceData dictionary]];
        }
        
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   agreedTermsOfServiceDataList, @"termsOfServiceDataList",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

void stove_authui_agreeForRegisterProvider(const char *className, const char *identifier) {
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    NSString *nsProviderClassName = StoveSDKMakeNSString(className);
    
    Class providerClass = NSClassFromString(nsProviderClassName);
    id provider = [[providerClass alloc] init];
    
    [SGSTermsOfServiceUI agreeForRegisterWithProvider:provider fromViewController:nil completionHandler:^(SGSResult * _Nonnull result, NSArray<SGSTermsOfServiceData *> * _Nullable agreedTermsOfServiceData) {
        
        NSMutableArray *agreedTermsOfServiceDataList = [NSMutableArray array];
        for (SGSTermsOfServiceData *termsOfServiceData in agreedTermsOfServiceData) {
            [agreedTermsOfServiceDataList addObject:[termsOfServiceData dictionary]];
        }
        
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   agreedTermsOfServiceDataList, @"termsOfServiceDataList",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

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

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

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

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

void stove_authui_verifyIdentification(const char *identifier, bool compareIdentifier)
{
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [SGSAuthUI verifyIdentificationWithcompareIdentifier:compareIdentifier fromViewController:nil completionHandler:^(SGSResult * _Nonnull result, NSString * _Nullable state) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   state, @"state",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

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

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