//
//  XXGPlayKitCore.m
//  XXGPlayKit
//
//  Created by apple on 2025/2/18.
//

#import "XXGPlayKitCore.h"
#import "XXGNetworkList.h"
#import "XXGNetworkMonitor.h"
#import "XXGAppInfo.h"
#import "XXGPlayKitConfig.h"
#import "XXGAlertView.h"
#import "NSObject+XXGModel.h"
#import "XXGExecuteActions.h"
#import "XXGSetting.h"
#import "XXGBoxManager.h"
#import "XXGUIKit.h"
#import "XXGFloatView.h"
#import "XXGToast.h"
#import "NSString+XXGString.h"
#import "XXGIAPManager.h"
#import "XXGLoadingView.h"
#import "NSString+URLEncoding.h"
#import <WebKit/WebKit.h>
#import "XXGMQTTManager.h"
#import "XXGWindowManager.h"
#import "XXGWKMethodAction.h"
#import "NSURL+XXGAnalyse.h"
#import "XXGThirdManager.h"
#import <WebKit/WebKit.h>
#import "XXGPlayKitCore+Delegates.h"
#import "XXGPlayKitCore+Canal.h"
#import "ZBObjectiveCBeaver.h"
#import "XXGUIDriver.h"
#import "NSURL+XXGAnalyse.h"

#define weakify(obj) __weak typeof(obj) weak##obj = obj;
#define strongify(obj) __strong typeof(obj) obj = weak##obj;

@interface XXGPlayKitCore()

@end

@implementation XXGPlayKitCore

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

+ (void)load {
    
    // 监听初始化状态
    [[NSNotificationCenter defaultCenter] addObserverForName:XXGSetting.XXGNotificationNameKeyStartStatusChange object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
        if ([[note object] integerValue] == XXGPlayKitStartStatusFinish) {
            if ([XXGPlayKitConfig shared].xxpk_comeinStatus == XXGPlayKitComeInStatusWillBegin) {
                ZBLogInfo(__data_core.xxpk_log_init_login);
                [[XXGPlayKitCore shared] xxpk_coreComein];
            }
            
            //
            if (!XXGPlayKitConfig.shared.xxpk_adaptionCof.xxpk_logStatus) {
                [ZBLog zb_removeAllDestinations];
            }
        }
    }];
    
    // Sdk在初始化前准备
    [self __sdk_prepare_before_initialization];
}

+ (instancetype)shared {
    static id shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[super allocWithZone:NULL] init];
    });
    return shared;
}

+ (void)__preloadResource {
    [XXGPlayKitConfig.shared xxpk_data_core];
    [XXGPlayKitConfig.shared xxpk_string_core];
    [XXGUIDriver xxpk_data_ui];
    [XXGUIDriver xxpk_string_ui];
}

+ (void)__sdk_prepare_before_initialization {
    // 加载资源
    [self __preloadResource];
    
    // 配置日志
    [ZBLogViewController setupLogger];
    
    dispatch_group_t group = dispatch_group_create();
    
    // 1. 网络检测
    dispatch_group_enter(group);
    [XXGNetworkMonitor xxpk_checkNetworkTypeAsync:^(BOOL xxpk_isConnected) {
        ZBLogInfo(__data_core.xxpk_log_net_status, XXGNetworkMonitor.xxpk_networkType);
        if (xxpk_isConnected) {
            dispatch_group_leave(group);
        }
    }];
    
    // 2. 请求追踪授权
    dispatch_group_enter(group);
    [XXGAppInfo xxpk_requestIDFAIfNeeded:^{
        dispatch_group_leave(group);
    }];
    
    // 当 group 内所有任务完成后，调用 xxpk_coreStart
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        [[XXGPlayKitCore shared] __xxpk_coreStart];
    });
}

- (void)__xxpk_coreStart {
    
    if (XXGPlayKitConfig.shared.xxpk_startStatus != XXGPlayKitStartStatusNot) {
        ZBLogInfo(__data_core.xxpk_log_init_already, XXGPlayKitConfig.shared.xxpk_startStatus);
        return;
    }
    
    ZBLogVerbose(__data_core.xxpk_log_init_start);
    XXGPlayKitConfig.shared.xxpk_startStatus = XXGPlayKitStartStatusBegin;
    
    weakify(self);
    [[XXGNetworkList xxpk_defaultNetwork] xxpk_networkStart:^(NSDictionary * _Nonnull responseObject) {
        
        NSArray *xxpk_actions = [XXGActionItem xxpk_modelArrayWithDictArray:responseObject[__data_core.xxpk_actions]];
        
        [XXGExecuteActions xxpk_executeActions:xxpk_actions index:0 completion:^{
            ZBLogVerbose(__data_core.xxpk_log_init_success);
            XXGPlayKitConfig.shared.xxpk_startStatus = XXGPlayKitStartStatusFinish;
        }];
        
    } failure:^(NSError * _Nonnull error) {
        strongify(self);
        [self __xxpk_handleStartError:error];
    }];
}

/// 处理初始化错误
- (void)__xxpk_handleStartError:(NSError *)error {
    XXGPlayKitConfig.shared.xxpk_startStatus = XXGPlayKitStartStatusNot;
    NSString *errorDescrip = [NSString stringWithFormat:__data_core.xxpk_error_code, error.localizedDescription, error.code];
    ZBLogVerbose(__data_core.xxpk_log_init_failed, errorDescrip);
    if (error.code == __data_core.xxpk_net_code_error) {
        weakify(self);
        [XXGAlertView xxpk_showAlertWithTitle:__string_core.xxpk_startError message:errorDescrip completion:^(NSInteger buttonIndex) {
            strongify(self);
            [self __xxpk_coreStart];
        }];
    }else {
        [self __xxpk_coreStart];
    }
}

- (void)__xxpk_autoComeinType {
    
    // 渠道
    if ([self __xxpk_canal_autoComeinType]) {
        return;
    }
    
    // 当前内存中有用户存在
    if ([XXGBoxManager xxpk_comeinedBox]) {
        [XXGLoadingView showLoadingOnWindow];
        [[XXGNetworkList xxpk_defaultNetwork] xxpk_networkToken:^(NSDictionary * _Nonnull responseObject) {
            [XXGLoadingView hideLoadingFromWindow];
            [self __xxpk_comeined:responseObject];
        } failure:^(NSError * _Nonnull error) {
            [XXGBoxManager xxpk_removeComeinedBox];
            [self __xxpk_autoComeinType];
        }];
        return;
    }
    
    // 自动登录
    if ([XXGPlayKitConfig shared].xxpk_adaptionCof.xxpk_autoComein) {
        [XXGLoadingView showLoadingOnWindow];
        [[XXGNetworkList xxpk_defaultNetwork] xxpk_networkGuest:^(NSDictionary * _Nonnull responseObject) {
            [XXGLoadingView hideLoadingFromWindow];
            [self __xxpk_comeined:responseObject];
        } failure:^(NSError * _Nonnull error) {
            NSString *errorDescrip = [NSString stringWithFormat:__data_core.xxpk_error_code, error.localizedDescription, error.code];
            [XXGAlertView xxpk_showAlertWithTitle:__string_core.xxpk_comeinError message:errorDescrip completion:nil];
        }];
        return;
    }
    
    // 本地存储用户到选择登录界面
    if ([XXGBoxManager xxpk_getBoxsContentFromLocal].count > 0) {
        [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypeSelectAccount xxpk_delegate:self];
        return;
    }
    
    // 展示H5登录界面
#ifdef XXGPLAYKITOS_TARGET
    if (XXGPlayKitConfig.shared.xxpk_extraParams.xxpk_isAudit) {
        [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypeH5Login xxpk_object:XXGPlayKitConfig.shared.xxpk_extraParams.xxpk_auditUrl xxpk_delegate:self];
        return;
    }
#endif
    // 展示原生界面
    [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypeComein xxpk_delegate:self];
}

- (void)__xxpk_comeined:(NSDictionary *)responseObject {
    
    [XXGUIKit xxpk_dissmissAllWindows];
    
    NSArray *xxpk_actions = [XXGActionItem xxpk_modelArrayWithDictArray:responseObject[__data_core.xxpk_actions]];
    
    [XXGExecuteActions xxpk_executeActions:xxpk_actions index:0 completion:^{
        ZBLogVerbose(__data_core.xxpk_log_login_success);
        // 先赋值，要不然关闭按钮会判断是否finish状态
        XXGPlayKitConfig.shared.xxpk_comeinStatus = XXGPlayKitComeInStatusFinish;
        
#ifdef XXGPLAYKITOS_TARGET
        // 越南个人信息验证
        if ([responseObject[__data_core.xxpk_user_info_url] xxpk_isNotEmpty]) {
            [self xxpk_showUIofPopup:__data_core.xxpk_user_info_url];
        }
#endif
        
        // 0.注册内购
        [[XXGIAPManager shared] xxpk_registerP];
        [XXGIAPManager shared].xxpk_delegate = self;
        
        // 1.展示欢迎页(S不展示)
        [XXGToast showBottom:__string_core.xxpk_comein_sus];
        
        // 2.添加小圆点
        if(XXGPlayKitConfig.shared.xxpk_adaptionCof.xxpk_docker.xxpk_status){
            [XXGFloatView xxpk_show];
            [[XXGFloatView shared] setXxpk_tapHandler:^(NSString *url){
                [self xxpk_showUIofUCenter:url.xxpk_isNotEmpty?url:XXGPlayKitConfig.shared.xxpk_adaptionCof.xxpk_box_center.xxpk_url];
            }];
        }
        
        if ([self.xxpk_delegate respondsToSelector:@selector(xxpk_comeinFinish:)]) {
            [self.xxpk_delegate xxpk_comeinFinish:[XXGBoxManager xxpk_comeinedBoxJson]];
        }
        
    }];
}

// MARK: - Public
- (void)xxpk_coreComein {
   
    if (XXGPlayKitConfig.shared.xxpk_comeinStatus == XXGPlayKitComeInStatusBegining) {
        ZBLogVerbose(__data_core.xxpk_log_login_ing);
        return;
    }
    
    if (XXGPlayKitConfig.shared.xxpk_comeinStatus == XXGPlayKitComeInStatusFinish) {
        ZBLogVerbose(__data_core.xxpk_log_login_logined);
        if ([self.xxpk_delegate respondsToSelector:@selector(xxpk_comeinFinish:)]) {
            [self.xxpk_delegate xxpk_comeinFinish:[XXGBoxManager xxpk_comeinedBoxJson]];
        }
        return;
    }
    
    ZBLogVerbose(__data_core.xxpk_log_login_prepare);
    XXGPlayKitConfig.shared.xxpk_comeinStatus = XXGPlayKitComeInStatusWillBegin;
    
    if (XXGPlayKitConfig.shared.xxpk_startStatus != XXGPlayKitStartStatusFinish) {
        ZBLogVerbose(__data_core.xxpk_log_login_not_init);
        return;
    }
    
    ZBLogVerbose(__data_core.xxpk_log_login_start);
    XXGPlayKitConfig.shared.xxpk_comeinStatus = XXGPlayKitComeInStatusBegining;
    
    [self __xxpk_autoComeinType];
}

- (void)xxpk_logout {
    ZBLogVerbose(__data_core.xxpk_log_logout);
    
    [XXGLoadingView showLoadingOnView:XXGWindowManager.shared.xxpk_firstWindow];
    
    // 渠道
    [self xxpk_canal_logout];
    
    // mqtt
    [[XXGMQTTManager shared] xxpk_disconnect];
    
    // 清空内存用户
    [XXGBoxManager xxpk_removeComeinedBox];
    
    XXGPlayKitConfig.shared.xxpk_comeinStatus = XXGPlayKitComeInStatusNot;
    
    // 小圆点
    if(XXGPlayKitConfig.shared.xxpk_adaptionCof.xxpk_docker.xxpk_status){
        // 隐藏悬浮球
        [XXGFloatView xxpk_hide];
    }
    
    [[XXGWindowManager shared] xxpk_dismissAllWindowsWithCompletion:^{
        if ([self.xxpk_delegate respondsToSelector:@selector(xxpk_logouted)]) {
            
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                [self.xxpk_delegate xxpk_logouted];
                [XXGLoadingView hideLoadingFromView:XXGWindowManager.shared.xxpk_firstWindow];
            });
            
        }
    }];
}

- (void)xxpk_uploadRoleInfo:(XXGRoleBody *)roleInfo {
    ZBLogVerbose(__data_core.xxpk_log_report_role);
    
    if (XXGPlayKitConfig.shared.xxpk_comeinStatus != XXGPlayKitComeInStatusFinish) {
        if ([self.xxpk_delegate respondsToSelector:@selector(xxpk_uploadRoleFinished:)]) {
            [self.xxpk_delegate xxpk_uploadRoleFinished:NO];
        }
        return;
    }
    
    if (roleInfo.xxpk_serverName.xxpk_isEmpty
        ||roleInfo.xxpk_serverId.xxpk_isEmpty
        ||roleInfo.xxpk_roleId.xxpk_isEmpty
        ||roleInfo.xxpk_roleName.xxpk_isEmpty
        ||roleInfo.xxpk_roleLevel.xxpk_isEmpty) {
        [XXGAlertView xxpk_showAlertWithTitle:__string_core.xxpk_tips message:__string_core.xxpk_uploadrole_error completion:nil];
        return;
    }
    
    [[XXGNetworkList xxpk_defaultNetwork] xxpk_networkUploadRoleInfo:[roleInfo xxpk_modelToDict] success:^(NSDictionary * _Nonnull responseObject) {
        ZBLogVerbose(__data_core.xxpk_log_report_role_success);
        
        // 渠道
        [self xxpk_canal_uploadRoleInfo:roleInfo];
        
        if ([self.xxpk_delegate respondsToSelector:@selector(xxpk_uploadRoleFinished:)]) {
            [self.xxpk_delegate xxpk_uploadRoleFinished:YES];
        }
    } failure:^(NSError * _Nonnull error) {
        ZBLogVerbose(__data_core.xxpk_log_report_role_failed);
        if ([self.xxpk_delegate respondsToSelector:@selector(xxpk_uploadRoleFinished:)]) {
            [self.xxpk_delegate xxpk_uploadRoleFinished:NO];
        }
    }];
}

- (void)xxpk_creatOrder:(XXGProductBody *)body xxpk_isCoinOrder:(BOOL)isCoin {
    ZBLogVerbose(__data_core.xxpk_log_pay_start);
    if (XXGPlayKitConfig.shared.xxpk_comeinStatus != XXGPlayKitComeInStatusFinish && !isCoin) {
        if ([self.xxpk_delegate respondsToSelector:@selector(xxpk_payFinished:)]) {
            [self.xxpk_delegate xxpk_payFinished:NO];
        }
        return;
    }
    [XXGThirdManager xxpk_logAddedToCartEvent];
    [XXGLoadingView showLoadingOnWindow];
    [[XXGIAPManager shared] xxpk_createOrder:body xxpk_isCoinOrder:isCoin];
}

// 冷启动
- (void)xxpk_didFinishLaunchingWithOptions:(NSDictionary *)launchOptions xconnectOptions:(UISceneConnectionOptions *)connetOptions {
    if (launchOptions) {
        // 场景 1：检查是否通过 URL Scheme 启动
        if (launchOptions[UIApplicationLaunchOptionsURLKey]) {
            NSURL *url = launchOptions[UIApplicationLaunchOptionsURLKey];
            XXGPlayKitConfig.shared.xxpk_deeplink = url.absoluteString;
        }
    }
    if (connetOptions) {
        // URL Scheme 处理
       NSArray<UIOpenURLContext*> *urlContexts = connetOptions.URLContexts.allObjects;
       if (urlContexts.count > 0) {
           NSURL *url = urlContexts.firstObject.URL;
           XXGPlayKitConfig.shared.xxpk_deeplink = url.absoluteString;
       }
    }
    ZBLogInfo(__data_core.xxpk_log_cold_start_url, XXGPlayKitConfig.shared.xxpk_deeplink);
    [XXGThirdManager xxpk_didFinishLaunchingWithOptions:launchOptions xconnectOptions:connetOptions];
}

// 热启动
- (BOOL)xxpk_applicationOpenURL:(NSURL *)url xoptions:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options xURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    NSString *hot_url = nil;
    if (options) {
        hot_url = url.absoluteString;
    }
    if (URLContexts) {
        hot_url = URLContexts.allObjects.firstObject.URL.absoluteString;
    }
    
    ZBLogInfo(__data_core.xxpk_log_hot_start_url, hot_url);
    
    if ([url.scheme hasPrefix:__data_core.xxpk_app]) {
        [self xxpk_wkView:nil makeMethodAction:url.host arg:url];
        return YES;
    }
#ifdef XXGPLAYKITCN_TARGET
    else if ([url.scheme hasPrefix:__data_core.xxpk_scheme_wx]
              && ([url.absoluteString rangeOfString:__data_core.xxpk_wx_oauth].location != NSNotFound)) {
        [self __xxpk_openFromWeixinWithUrl:url];
        return YES;
    }
#endif
    else {
        return [XXGThirdManager xxpk_applicationOpenURL:url xoptions:options xURLContexts:URLContexts];
    }
}

- (BOOL)xxpk_applicationContinueUserActivity:(NSUserActivity *)userActivity {
#ifdef XXGPLAYKITCN_TARGET
    [XXGThirdManager xxpk_applicationContinueUserActivity:userActivity];
#endif
    return YES;
}

- (void)xxpk_coreHandleOpenUrl:(NSString *)url {
    if (url.xxpk_isEmpty) {
        return;
    }
    NSURL *_url = [NSURL URLWithString:[url xxpk_urlDecodedString]];
    if ([_url.scheme hasPrefix:__data_core.xxpk_app]) {
        [self xxpk_wkView:nil makeMethodAction:_url.host arg:_url];
    }else {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] openURL:_url options:@{} completionHandler:nil];
        });
    }
}

- (void)xxpk_openUserCenterSidebar:(NSString *)type {
    if (XXGPlayKitConfig.shared.xxpk_comeinStatus != XXGPlayKitComeInStatusFinish) {
        return;
    }
    NSString *url = [XXGPlayKitConfig.shared.xxpk_adaptionCof.xxpk_box_center.xxpk_url stringByAppendingFormat:__data_core.xxpk_core_open_page,type];
    [XXGPlayKitCore.shared xxpk_showUIofUCenter:url];
}

- (void)xxpk_iapRepair {
    [XXGIAPManager xxpk_iapRepair];
    [XXGPlayKitCore.shared xxpk_logout];
}

// MARK: - Show UI
- (void)xxpk_dissmissCurrentUI {
    [XXGUIKit xxpk_dissmissCurrentWinow];
}
- (void)xxpk_showUIofChangeBoxKey:(id)object {
    [XXGUIKit xxpk_showViewControllerWithType:(XXGShowViewControllerTypeChangePassword) xxpk_object:object xxpk_delegate:self];
}
- (void)xxpk_showUIofbindMobile:(id)object hasWkView:(WKWebView *)hasWkView {
    NSArray *xxpk_bindArray = @[object,hasWkView?:@""];
    [XXGUIKit xxpk_showViewControllerWithType:(XXGShowViewControllerTypeBindMobile) xxpk_object:xxpk_bindArray xxpk_delegate:self];
}
- (void)xxpk_showUIofUCenter:(id)object {
    [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypeUserCenter xxpk_object:object xxpk_delegate:self];
}
- (void)xxpk_showUIofSelectPayMethod:(id)objcet xxpk_delegate:(id<XXGUIkitDelegate>)xxpk_delegate {
    [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypeSelectPP xxpk_object:objcet xxpk_delegate:xxpk_delegate];
}
- (void)xxpk_showUIofPopup:(id)objcet {
    [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypePopup xxpk_object:objcet xxpk_delegate:self];
}
- (void)xxpk_showUIofTrampoline:(id)objcet  {
    [XXGUIKit __xxpk_showNoStackViewControllerWithType:XXGShowViewControllerTypePopup xxpk_object:objcet xxpk_delegate:self];
}
- (void)xxpk_showUIofSavePS:(id)object {
    [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypeSavePS xxpk_object:object xxpk_delegate:self];
}
#ifdef XXGPLAYKITCN_TARGET
- (void)xxpk_showUIofRealName:(id)object  {
    [XXGUIKit xxpk_showViewControllerWithType:XXGShowViewControllerTypeRealName xxpk_object:object xxpk_delegate:self];
}

- (void)xxpk_openWeiXinAuth {
    NSString *url = [NSString stringWithFormat:__data_core.xxpk_open_weixin_auth,XXGPlayKitConfig.shared.xxpk_weixinAppid].xxpk_urlEncodedString;
    [self xxpk_coreHandleOpenUrl:url];
}

- (void)__xxpk_openFromWeixinWithUrl:(NSURL *)url {
    NSDictionary *retDic =  [url xxpk_analyse];
    if (retDic.allKeys.count == 0) {
        [XXGAlertView xxpk_showAlertWithTitle:__string_core.xxpk_tips message:isUcenterBind?__string_core.xxpk_bindError:__string_core.xxpk_comeinError completion:nil];
        return;
    }
    if (isUcenterBind) { // 个人中心绑定微信
        [[XXGNetworkList xxpk_defaultNetwork] xxpk_networkWeixinBindWithCode:retDic[__data_core.xxpk_net_code] weixinAppId:XXGPlayKitConfig.shared.xxpk_weixinAppid success:^(NSDictionary * _Nonnull responseObject) {
            // 绑定成功提示并刷新个人中心界面
            [XXGToast showBottom:__string_core.xxpk_weixinBindSucces];
            [[NSNotificationCenter defaultCenter] postNotificationName:__data_core.xxpk_ntf_ucenter_refresh object:nil];
        } failure:^(NSError * _Nonnull error) {
            NSString *errorDescrip = [NSString stringWithFormat:__data_core.xxpk_error_code, error.localizedDescription, error.code];
            [XXGAlertView xxpk_showAlertWithTitle:__string_core.xxpk_bindError message:errorDescrip completion:nil];
        }];
        
    }else { // 微信登录
        [XXGLoadingView showLoadingOnWindow];
        [[XXGNetworkList xxpk_defaultNetwork] xxpk_networkWeixinLoginWithCode:retDic[__data_core.xxpk_net_code] weixinAppId:XXGPlayKitConfig.shared.xxpk_weixinAppid success:^(NSDictionary * _Nonnull responseObject) {
            [XXGLoadingView hideLoadingFromWindow];
            [self __xxpk_comeined:responseObject];
        } failure:^(NSError * _Nonnull error) {
            [XXGLoadingView hideLoadingFromWindow];
            NSString *errorDescrip = [NSString stringWithFormat:__data_core.xxpk_error_code, error.localizedDescription, error.code];
            [XXGAlertView xxpk_showAlertWithTitle:__string_core.xxpk_comeinError message:errorDescrip completion:nil];
        }];
    }
}
#endif

@end
