#import "P101XPDelegateWrapper.h"

#import <StoreKit/StoreKit.h>
#import <P101XP/P101XP-Swift.h>

#import "P101XPHelper.h"

@implementation P101XPDelegateWrapper

NSString *const UNITY_GAMEOBJECT_NAME = @"PluginService";

+ (P101XPDelegateWrapper *)sharedWrapper
{
    static P101XPDelegateWrapper *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[P101XPDelegateWrapper alloc] init];
    });
    return sharedInstance;
}

- (void)p101xpOnRewardedInvite:(NSString *)referrer {
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setValue:referrer forKey:@"referrer"];
    NSString *result = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnRewardedInvite" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnRewardedInvite" withMessage:result];
}

- (void)p101xpOnRewardedInviteLinkRecipient:(long long)userId event:(NSString *)event {
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setValue:[[NSNumber numberWithLongLong:userId] stringValue] forKey:@"referrer"];
    [dictionary setValue:event forKey:@"eventName"];
    NSString *result = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnRewardedInviteLinkRecipient" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnRewardedInviteLinkRecipient" withMessage:result];
}

- (void)p101xpOnInitializeResult:(NSError *)error {
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setValue:[NSNumber numberWithBool:[P101XPSDK isInitialized]] forKey:@"initialized"];
    if (error != nil) {
        [dictionary setValue:error.localizedDescription forKey:@"error"];
    }
    NSString *result = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnInitializeResult" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnInitializeResult" withMessage:result withError:error];
    NSMutableDictionary *billing = [[NSMutableDictionary alloc] init];
    [billing setValue:@YES forKey:@"available"];
    if (error != nil) {
        [billing setValue:error.localizedDescription forKey:@"error"];
    }
    result = [P101XPHelper jsonStringFrom:billing];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnBillingInitializeResult" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnBillingResult" withMessage:result withError:error];
}

- (void)p101xpOnAuthorizeWithResult:(P101XPToken *)token error:(NSError *)error {
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    if (error != nil) {
        [dictionary setValue:error.localizedDescription forKey:@"error"];
    } else {
        [dictionary setValue:[P101XPHelper tokenToDict:token] forKey:@"token"];
    }
    NSString *result = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnAuthorizeResult" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnAuthorizeResult" withMessage:result withError:error];
}

- (void)p101xpOnGetSocialFriendsWithResult:(NSArray<P101XPSocialFriend *> *)socialFriends error:(NSError *)error {
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    if (error != nil) {
        [dictionary setValue:error.localizedDescription forKey:@"error"];
    } else {
        NSMutableArray *array = [[NSMutableArray alloc] init];
        for (P101XPSocialFriend *fr in socialFriends) {
            NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
            [dictionary setValue:fr.level forKey: @"level"];
            [dictionary setValue:fr.mobileId forKey: @"mobileId"];
            [dictionary setValue:fr.friendName forKey: @"name"];
            [dictionary setValue:fr.pictureUrl forKey: @"pictureUrl"];
            
            [array addObject:dictionary];
        }
        [dictionary setValue:array forKey:@"friends"];
    }
    NSString *result = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnGetSocialFriendsResult" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnGetSocialFriendsResult" withMessage:result withError:error];
}

- (void)p101xpOnInviteWithResult:(NSString *)result error:(NSError *)error {
    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
    if (error != nil) {
        [dictionary setObject:error.localizedDescription forKey:@"error"];
    } else {
        [dictionary setObject:result ? [NSNumber numberWithBool:true] : [NSNumber numberWithBool:false] forKey:@"invited"];
    }
    NSString *dictionaryResult = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnInviteResult" UTF8String], [dictionaryResult UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnGetSocialFriendsResult" withMessage:dictionaryResult withError:error];
}

- (void)p101xpOnLogout {
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnLogout" UTF8String], "");
    [P101XPHelper logWithPrefix:@"p101xpOnLogout"];
}

- (void)p101xpOnOfferwallAdLoaded {
    [P101XPHelper logWithPrefix:@"p101xpOnOfferwallAdLoaded"];
}

- (void)p101xpOnPurchaseProductWithResult:(P101XPPurchase *)purchase error:(NSError *)error {
    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
    if (error != nil) {
        [dictionary setObject:error.localizedDescription forKey:@"error"];
    } else {
        [dictionary setObject:[[NSBundle mainBundle] bundleIdentifier] forKey:@"packageName"];
        [dictionary setObject:purchase.appStoreTransaction.payment.productIdentifier forKey:@"productId"];
        [dictionary setObject:purchase.transactionId forKey:@"transactionId"];
        [dictionary setObject:[purchase getToken] forKey:@"token"];
    }
    NSString *result = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnPurchaseProductResult" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnPurchaseProductResult" withMessage:result withError:error];
}

- (void)p101xpOnGetAnalyticsWithConversionData:(NSDictionary *)data {
    NSString *result = [P101XPHelper jsonStringFrom:data];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnAnalyticsConversionData" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnGetAnalyticsConversionData" withMessage:result];
}

- (void)p101xpOnPushMessageReceived:(P101XPMessage *)message {
    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
    if (message != nil) {
        [dictionary setObject:message.messageId forKey:@"messageId"];
        [dictionary setObject:message.message forKey:@"messageBody"];
    }
    [dictionary setObject:[NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]] forKey:@"messageSentTime"];
    NSString *result = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnMessageReceived" UTF8String], [result UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnPushMessageReceived" withMessage:result];
}

- (void)p101xpOnShowWebStoreResult:(NSError *)error {
    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
    if (error != nil) {
        [dictionary setObject:error.localizedDescription forKey:@"error"];
    } else {
        [dictionary setObject:[NSNumber numberWithBool:true] forKey:@"success"];
    }
    NSString *dictionaryResult = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnShowWebStoreResult" UTF8String], [dictionaryResult UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnShowWebStoreResult" withMessage:dictionaryResult withError:error];
}

- (void)p101xpOnGetAccountWithResult:(P101XPAccountData *)result error:(NSError *)error {
    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
    if (error != nil) {
        [dictionary setObject:error.localizedDescription forKey:@"error"];
    } else {
        [dictionary setValue:[P101XPHelper accountToDict:result] forKey:@"account"];
    }
    NSString *dictionaryResult = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnGetAccountResult" UTF8String], [dictionaryResult UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnGetAccountWithResult" withMessage:dictionaryResult withError:error];
}

- (void)p101xpOnDeleteAccountResult:(NSError * _Nullable)error {
    // TODO: Implement
}

- (void)p101xpOnGetProductsWithResult:(NSArray<P101XPProduct *> * _Nullable)result error:(NSError * _Nullable)error {
    NSMutableDictionary * dictionary = [[NSMutableDictionary alloc] init];
    if (error != nil) {
        [dictionary setObject:error.localizedDescription forKey:@"error"];
    } else {
        if (result != nil) {
            NSMutableArray *prods_array = [[NSMutableArray alloc] init];
            for (P101XPProduct *product in result) {
                [prods_array addObject:[P101XPHelper productToDict:product]];
            }
            [dictionary setValue:prods_array forKey:@"products"];
        } else {
            [dictionary setObject:@"The result is null!" forKey:@"error"];
        }

    }
    NSString *dictionaryResult = [P101XPHelper jsonStringFrom:dictionary];
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnGetProductsResult" UTF8String], [dictionaryResult UTF8String]);
    [P101XPHelper logWithPrefix:@"p101xpOnGetProductsWithResult" withMessage:dictionaryResult withError:error];
}

- (void)p101xpShouldPresentWithViewController:(UIViewController * _Nullable)viewController {
    // TODO: Implement
}

- (void)p101xpOnRewardedAdShowed:(NSUInteger)rewardAmount name:(NSString *)rewardName error:(NSError *)error {
    [P101XPHelper logWithPrefix:@"p101xpOnRewardedAdShowed"];
}

- (void)onFinishPurchaseResult:(const char *)jsonPurchase {
    UnitySendMessage([UNITY_GAMEOBJECT_NAME UTF8String], [@"OnFinishPurchaseResult" UTF8String], jsonPurchase);
    [P101XPHelper logWithPrefix:@"onFinishPurchaseResult" withMessage:[NSString stringWithUTF8String:jsonPurchase]];
}

@end
