
#import <Foundation/Foundation.h>
#import <XYSDK/XYSDK.h>
#import <GASDK/GAConstants.h>
#import <GASDK/GASDK.h>
#import "TYConfig.h"

#define TOKEN_ERROR @"-8"
extern "C" {

        NSString* DicTojsonString(NSDictionary *dict)
        {
            try {
                NSError *error;
                NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingFragmentsAllowed error:&error];
                NSString *jsonString;
                if (!jsonData) {
                    NSLog(@"%@",error);
                } else {
                    jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
                }
                NSMutableString *mutStr = [NSMutableString stringWithString:jsonString];
                return mutStr;
            } catch (NSException *exception) {
                return @"";
            }
        }

        void ProcessLoginResult(XYResp *resp)
        {
            NSMutableDictionary *resultDict = [@{} mutableCopy];
            [resultDict setValue:[NSString stringWithFormat:@"%ld", (long)resp.errCode] forKey:@"code"];
            [resultDict setValue:resp.errStr ? resp.errStr : @"" forKey:@"errStr"];
            if(resp.errCode == XYSuccess){
                [resultDict setValue:resp.respObj forKey:@"respObj"];
            }
            NSString *result = DicTojsonString(resultDict);
            const char* param = AllocCString(result);
            UnitySendMessage("TYSdkFacade","LoginResult", param);
        }

        //更新登录支付域名
        void UnityResetServerUrl(const char* url)
        {
            NSString* serverUrl = [[NSString alloc] initWithCString:url encoding:NSUTF8StringEncoding];
            NSLog(@"TYSdkInterface UnityResetServerUrl %@", serverUrl);
            if(serverUrl != nil && ![serverUrl isEqualToString:@""])
            {
                [XYApi resetServerUrlString:serverUrl];
            }
        }

        //登录
        void UnityLoginByTokenFun(const char* ctoken)
        {
            NSLog(@"TYSdkInterface UnityLoginByTokenFun %s", ctoken);
            NSString* token = [[NSString alloc] initWithCString:ctoken encoding:NSUTF8StringEncoding];
            if(token != nil && ![token isEqualToString:@""])
            {
                [XYApi XYLoginByToken:token completionHandler:^(XYResp *resp) {
                    NSLog(@"TYSdkInterface UnityLoginByTokenFun %ld, %@, %@", (long)resp.errCode, resp.respObj, resp.errStr);
                    ProcessLoginResult(resp);
                }];
            }else{
                NSMutableDictionary *resultDict = [@{} mutableCopy];
                [resultDict setValue:TOKEN_ERROR forKey:@"code"];
                [resultDict setValue:@"" forKey:@"errStr"];
                NSString *result = DicTojsonString(resultDict);
                const char* param = AllocCString(result);
                UnitySendMessage("TYSdkFacade","LoginResult", param);
            }
        }

        void UnityLoginByGuest()
        {
            XYLoginReq *req = [XYLoginReq initWithLoginType:XYLoginWithGuest];
            [XYApi XYLoginWith:req completionHandler:^(XYResp * _Nonnull resp) {
                NSLog(@"TYSdkInterface UnityLoginByGuest: %@", resp);
                ProcessLoginResult(resp);
            }];
        }

        void UnityLoginByGoogle()
        {
            XYLoginReq *req = [XYLoginReq initWithLoginType:XYLoginWithGoogle];
            [XYApi XYLoginWith:req completionHandler:^(XYResp * _Nonnull resp) {
                NSLog(@"TYSdkInterface UnityLoginByGoogle: %@", resp);
                ProcessLoginResult(resp);
            }];
        }

        void UnityLoginByFacebook()
        {
            XYLoginReq *req = [XYLoginReq initWithLoginType:XYLoginWithFB];
            [XYApi XYLoginWith:req completionHandler:^(XYResp * _Nonnull resp) {
                NSLog(@"TYSdkInterface UnityLoginByFB: %@", resp);
                ProcessLoginResult(resp);
            }];
        }

        void UnityLoginByApple()
        {
            XYLoginReq *req = [XYLoginReq initWithLoginType:XYLoginWithApple];
            [XYApi XYLoginWith:req completionHandler:^(XYResp * _Nonnull resp) {
                NSLog(@"TYSdkInterface UnityLoginByApple: %@", resp);
                ProcessLoginResult(resp);
            }];
        }

        void UnityGetIdentityFun(const char* type)
        {

        }

        void UnityLoginOut()
        {
            NSLog(@"TYSdkInterface UnityLoginOut");
            [XYApi XYLogoutWithCompletion:^(XYResp * _Nonnull resp) {
                if(resp.errCode == XYSuccess)
                {
                    NSLog(@"TYSdkInterface UnityLoginOut Success");
                    NSLog(@"%@", resp.respObj);
                }
                else
                {
                    NSLog(@"TYSdkInterface UnityLoginOut Faild");
                    NSLog(@"Error Code:%ld  msg:%@", resp.errCode, resp.errStr);
                }
            
            }];
        }

        void UnityLogoutGoogle()
        {
            NSLog(@"TYSdkInterface UnityLogOut Google");
            [XYApi XYLogoutChannelWithType:XYLoginWithGoogle];
        }
        void UnityLogoutFacebook()
        {
            NSLog(@"TYSdkInterface UnityLogOut Facebook");
            [XYApi XYLogoutChannelWithType:XYLoginWithFB];
        }

        void UnityLogoutGuest()
        {
            NSLog(@"TYSdkInterface UnityLogOutGuset");
            [XYApi XYLogoutChannelWithType:XYLoginWithGuest];
        }

        void UnityLogoutApple()
        {
            NSLog(@"TYSdkInterface UnityLogoutApple");
            [XYApi XYLogoutChannelWithType:XYLoginWithApple];
        }

        //支付
        void UnityKnow(const char* userId,const char* productId,const char* productPrice,const char* productName,const char* productCount,const char* orderid,const char* appinfo)
        {
            NSLog(@"TYSdkInterface UnityKnow ");
            NSString* pUserId = [[NSString alloc] initWithCString:userId encoding:NSUTF8StringEncoding];
            NSString* porderid = [[NSString alloc] initWithCString:orderid encoding:NSUTF8StringEncoding];
            NSString* pProductId = [[NSString alloc] initWithCString:productId encoding:NSUTF8StringEncoding];
            NSString* pProductPrice = [[NSString alloc] initWithCString:productPrice encoding:NSUTF8StringEncoding];
            NSString* pProductName = [[NSString alloc] initWithCString:productName encoding:NSUTF8StringEncoding];
            NSString* pProductCount = [[NSString alloc] initWithCString:productCount encoding:NSUTF8StringEncoding];
            NSString* pAppInfo = [[NSString alloc] initWithCString:appinfo encoding:NSUTF8StringEncoding];
            XYProduct* product = [XYProduct createShoppingDataWith:XYOnlyConsume];
            if (porderid != NULL && porderid.length > 0) {
                product.productOrderId = porderid;
            }
            [product XYProductWithAppInfo:pAppInfo productId:pProductId productName:pProductName productPrice:[pProductPrice floatValue] gameId:-1 productCount:[pProductCount integerValue] userId:[pUserId integerValue]];
            [XYApi XYCharge:product completionHandler:^(XYResp * _Nonnull resp) {
                NSMutableDictionary *resultDict = [@{} mutableCopy];
                [resultDict setValue:[NSString stringWithFormat:@"%ld", (long)resp.errCode] forKey:@"code"];
                [resultDict setValue:resp.errStr ? resp.errStr : @"" forKey:@"errStr"];
                NSString *result = DicTojsonString(resultDict);
                const char* param = AllocCString(result);
                UnitySendMessage("TYSdkFacade","PayResult", param);
            }];
        }

        void GetSKUList()
        {
            NSLog(@"TYSdkInterface GetSKUList ");
            [XYApi XYGetLocalProductPriceWithCompletion:^(XYResp * _Nonnull resp) {

                NSMutableDictionary *resultDict = [@{} mutableCopy];
                [resultDict setValue:[NSString stringWithFormat:@"%ld", (long)resp.errCode] forKey:@"code"];
                if(resp.errCode == XYSuccess){
                    NSLog(@"TYSdkInterface GetSKUList Success");
                    NSLog(@"SKUList %@", resp.respObj);
                    [resultDict setValue:resp.respObj forKey:@"respObj"];
                }
                else
                {
                    NSLog(@"TYSdkInterface GetSKUList Faild");
                    NSLog(@"SKUList %ld %@", resp.errCode, resp.errStr);
                }

                NSString *result = DicTojsonString(resultDict);
                const char* param = AllocCString(result);
                UnitySendMessage("TYSdkFacade","SKUListResult", param);
            }];
        }

        //打点
        void SetGaUserInfo(const char* userId)
        {
            NSString *userid = [[NSString alloc] initWithCString:userId encoding:NSUTF8StringEncoding];
            [[GASDK getGAlog:SDK_PROJECTID] setUserId:userid];
        }

        void SetGaCommonInfo(const char* SetGaCommonInfo)
        {
            NSString * jsonString  = [NSString stringWithFormat:@"%s", SetGaCommonInfo];
            NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
            NSError* err;
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
            if(!err){
                [[GASDK getGAlog:SDK_PROJECTID] initWithGameId:SDK_GAMEID clientId:SDK_CLIENTID withCommonParams:dic serverUrl:GA_INTERNATIONAL];
            }
        }

        void GAReportParams(int type, const char* eventstr, const char* paramstr)
        {
            NSString * jsonString  = [NSString stringWithFormat:@"%s", paramstr];
            NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
            NSError* err;
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
            if(!err){
                [[GASDK getGAlog:SDK_PROJECTID] initWithGameId:SDK_GAMEID clientId:SDK_CLIENTID withCommonParams:dic serverUrl:GA_INTERNATIONAL];
            }

        }

        void LinkGoogle(const int userId)
        {
            NSLog(@"TYSdkInterface LinkGoogle");
            NSDictionary * userDic = [XYApi XYGetCurrentUserDict];
            XYBindReq *bindReq = [XYBindReq initBindWithPlatform:XYBindGoodle UserId: [ [userDic objectForKey:@"userId"] unsignedIntegerValue]];
            [XYApi XYBindByBindReq:bindReq isUnbindGuest:@"false" completionHandler:^(XYResp * _Nonnull resp) {
                if(resp.errCode == XYSuccess)
                {
                    NSLog(@"TYSdkInterface LinkGoogle Success");
                    UnitySendMessage("TYSdkFacade","LinkAccoutResult", "1");
                }
                else
                {
                    NSLog(@"TYSdkInterface LinkGoogle Faild");
                    UnityLogoutGoogle();
                    UnitySendMessage("TYSdkFacade","LinkAccoutResult", "0");
                }
            }];
        }

        void IsLinkedGoogle()
        {
            [XYApi CheckUserExist:XYBindGoodle completion:^(XYResp * _Nonnull resp) {
                if (resp.errCode == XYSNSExist) {
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "1");
                }else if (resp.errCode == XYSNSNotExist){
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "0");
                } else {
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "-1");
                }
            }];
        }

        void UnlinkGoogle()
        {
            
        }

        void LinkFacebook(const int userId)
        {
            NSLog(@"TYSdkInterface LinkFacebook");
            NSDictionary * userDic = [XYApi XYGetCurrentUserDict];
            XYBindReq *bindReq = [XYBindReq initBindWithPlatform:XYBindFB UserId: [ [userDic objectForKey:@"userId"] unsignedIntegerValue]];
            [XYApi XYBindByBindReq:bindReq isUnbindGuest:@"false" completionHandler:^(XYResp * _Nonnull resp) {
                if(resp.errCode == XYSuccess)
                {
                    NSLog(@"TYSdkInterface LinkFacebook Success");
                    UnitySendMessage("TYSdkFacade","LinkAccoutResult", "1");
                }
                else
                {
                    NSLog(@"TYSdkInterface LinkFacebook Faild");
                    UnityLogoutFacebook();
                    UnitySendMessage("TYSdkFacade","LinkAccoutResult", "0");
                    
                }
            }];
        }

        void IsLinkedFacebook()
        {
            [XYApi CheckUserExist:XYBindFB completion:^(XYResp * _Nonnull resp) {
                if (resp.errCode == XYSNSExist) {
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "1");
                }else if (resp.errCode == XYSNSNotExist){
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "0");
                } else {
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "-1");
                }
            }];
        }

        void UnlinkFacebook()
        {
            
        }

        void LinkApple()
        {

            NSLog(@"TYSdkInterface LinkApple");
            NSDictionary * userDic = [XYApi XYGetCurrentUserDict];
            XYBindReq *bindReq = [XYBindReq initBindWithPlatform:XYBindApple UserId: [ [userDic objectForKey:@"userId"] unsignedIntegerValue]];
            [XYApi XYBindByBindReq:bindReq isUnbindGuest:@"false" completionHandler:^(XYResp * _Nonnull resp) {
                if(resp.errCode == XYSuccess)
                {
                    NSLog(@"TYSdkInterface LinkApple Success");
                    UnitySendMessage("TYSdkFacade","LinkAccoutResult", "1");
                }
                else
                {
                    NSLog(@"TYSdkInterface LinkApple Faild");
                    UnityLogoutFacebook();
                    UnitySendMessage("TYSdkFacade","LinkAccoutResult", "0");
                    
                }
            }];
        }

        void IsLinkedApple()
        {
            [XYApi CheckUserExist:XYBindApple completion:^(XYResp * _Nonnull resp) {
                if (resp.errCode == XYSNSExist) {
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "1");
                }else if (resp.errCode == XYSNSNotExist){
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "0");
                } else {
                    UnitySendMessage("TYSdkFacade","CheckLinkResult", "-1");
                }
            }];
        }

        void UnlinkApple()
        {

        }


}
