let __miniSdkLogPrefix = "[TP_MINI_SDK] :";
//typhoon 小游戏sdk
let __performance = qg.getPerformance();
let systemInfo = qg.getSystemInfoSync();
let screenWidth = systemInfo.screenWidth;
let screenHeight = systemInfo.screenHeight;
console.log('屏幕宽高', screenWidth, screenHeight);

let __minisdkConfig = window['minisdk-config'];
console.log('minisdk参数:', __minisdkConfig);

let __umaPlugin = window.umaPlugin;
console.log('__umaPlugin:', __umaPlugin);


//视频广告
let videoAd = {
    rewardedVideoAd: null,
    flag: false,
    adResult: null,
    reloadDelayCode: -1,
    adParam: null,
    isEnable: true,
    retryTimeMs: 5000,
    resetIntersCoolFunc: null,//重置插页冷却代理
    //初始化
    initAd: function (param, func) {
        this.adParam = param;
        this.resetIntersCoolFunc = func;
        this.isEnable = param.enable;
        if (!this.isEnable) {
            sdkLog('视频广告未开启');
            return;
        }
        sdkLog("init", param);
        console.log('视频参数', param);
        this.rewardedVideoAd = qg.createRewardedVideoAd({ posId: this.adParam.posId });
        this.rewardedVideoAd.onLoad(() => {
            sdkLog('激励视频 广告加载成功');
            this.flag = true;
        });
        this.rewardedVideoAd.onError(err => {
            this.flag = false;
            clearTimeout(this.reloadDelayCode);
            sdkLog('激励视频拉取失败', err, `${this.retryTimeMs}ms后重试`);
            this.reloadDelayCode = setTimeout(() => {
                this.rewardedVideoAd.load();
            }, retryTimeMs);
        });
        this.rewardedVideoAd.onClose(res => {
            this.flag = false;
            if (res && res.isEnded) {
                // 正常播放结束，可以下发游戏奖励
                if (this.adResult != null) {
                    this.adResult(true);
                }
            }
            else {
                // 播放中途退出，不下发游戏奖励
                if (this.adResult != null) {
                    this.adResult(false);
                }
            }
            this.rewardedVideoAd.load();
        })

    },
    getFlag: function () {
        return this.flag;
    },
    showVideo: function (scene, success, fail) {
        if (!this.isEnable) {
            fail('视频广告未开启');
            return;
        }
        //TODO//上报打点scene
        sdkLog('showVideo', scene, success, fail);
        this.adResult = function (res) {
            if (res) {
                success();
                if (this.adParam.resetIntersCool > 0) {
                    //重置插页冷却
                    if (this.resetIntersCoolFunc) {
                        this.resetIntersCoolFunc(this.adParam.resetIntersCool);
                    }
                }
            } else {
                fail();
            }

        };
        if (this.rewardedVideoAd == null) {
            fail('rewardedVideoAd is null');
            return;
        }
        if (!this.flag) {
            fail('rewardedVideoAd flag is false');
            return;
        }
        this.rewardedVideoAd.show().catch(err => {
            this.flag = false;
            this.rewardedVideoAd.load()
                .then(() => rewardedVideoAd.show());
        });
    }
};

//插页广告
let intersAd = {
    interstitialAd: null,
    flag: false,
    reloadDelayCode: -1,
    adParam: null,
    nextTime: 0,
    isEnable: true,
    retryTimeMs: 5000,//重试时间ms
    initAd: function (param) {
        this.adParam = param;
        this.isEnable = param.enable;
        console.log('插页参数', this.adParam);
        if (!this.isEnable) {
            sdkLog('插页广告未开启');
            return;
        }
        this.loadAd();
    },
    loadAd: function () {
        if (this.interstitialAd != null) {
            this.interstitialAd.destroy();
        }
        this.flag = false;
        clearTimeout(this.reloadDelayCode);
        this.interstitialAd = qg.createInterstitialAd({ posId: this.adParam.posId });
        this.interstitialAd.onLoad(() => {
            sdkLog('inters onLoad')
            this.flag = true;
        });
        this.interstitialAd.onError(err => {
            sdkLog('inters onError', err, `${retryTime}ms 后重试`);
            this.reload();
        });
        this.interstitialAd.onClose(res => {
            sdkLog('inters onClose');
            this.flag = false;
            this.refreshNextIntersTime(this.adParam.delay);
        });
    },
    showInters: function (scene) {
        sdkLog('showInters', scene);
        if (!this.isEnable) {
            sdkLog('插页广告未开启');
            return;
        }
        if (this.interstitialAd == null) {
            return;
        }
        const now = __performance.now();
        if (now < this.nextTime) {
            sdkLog(`showInters 失败,未达到插屏冷却，${this.nextTime - now}ms 后再试`);
            return;
        }
        if (this.flag == false) {
            sdkLog('showInters 失败, flag: ', this.flag);
            return;
        }
        sdkLog('showInters show...');
        this.flag = false;
        this.interstitialAd.show().then(() => {
            sdkLog('插屏广告展示完成');
            this.refreshNextIntersTime(this.adParam.delay);
        }).catch((err) => {
            sdkLog('showInters 错误', err);
            this.loadAd();
        });
    },
    reload: function () {
        sdkLog('inters 重新加载');
        this.flag = false;
        clearTimeout(this.reloadDelayCode);
        //等待5秒后重新拉取
        this.reloadDelayCode = setTimeout(() => {
            this.interstitialAd.load();
        }, this.retryTimeMs);
    },
    refreshNextIntersTime: function (delay) {
        sdkLog(`inters 更新下一次展示时间 ${delay} s`);
        let next = __performance.now() + delay * 1000;
        if (next > this.nextTime) {
            this.nextTime = next;
        }
        sdkLog(`下次时间${this.nextTime}`);
    }
}

//banner条广告
let bannerAd = {
    ad: null,
    adParam: null,
    loaded: false,
    reloadDelayCode: -1,
    bannerOn: false,
    isEnable: true,
    reloadCooldown: 5000,//重新加载间隔ms
    initAd: function (param) {
        this.adParam = param;
        this.isEnable = param.enable;
        console.log('Banner参数', this.adParam);
        if (!this.isEnable) {
            sdkLog('Banner广告未开启');
            return;
        }
        this.loadAd();
    },
    loadAd: function () {
        this.loaded = false;
        if (this.ad != null) {
            this.ad.destroy();
        }
        clearTimeout(this.reloadDelayCode);
        let loadParam = {};
        loadParam.posId = this.adParam.posId;
        loadParam.adIntervals = this.adParam.interval;
        if (this.adParam.bottom == 1) {
            loadParam.style = {};
        }
        this.ad = qg.createBannerAd(loadParam);

        this.ad.onLoad(() => {
            sdkLog('banner 加载完毕')
            this.loaded = true;
            this.updateBannerRenderer();
        });
        this.ad.onError(err => {
            sdkLog('banner 加载失败', err, `${this.reloadCooldown}ms后重试`);
            this.loaded = false;
            this.reloadDelayCode = setTimeout(() => {
                this.loadAd();
            }, this.reloadCooldown);
        });

    },
    showBanner: function () {
        sdkLog('showBanner');
        if (!this.isEnable) {
            sdkLog('Banner广告未开启');
            return;
        }
        this.bannerOn = true;
        this.updateBannerRenderer();
    },
    hideBanner: function () {
        sdkLog('hideBanner');
        if (!this.isEnable) {
            sdkLog('Banner广告未开启');
            return;
        }
        this.bannerOn = false;
        this.updateBannerRenderer();
    },
    updateBannerRenderer: function () {
        sdkLog('updateBannerRenderer...');
        if (this.ad == null) {
            sdkLog(`Banner ad  is null 暂时不处理,跳过`);
            return;
        }
        if (this.loaded == false) {
            sdkLog(`Banner loaded is false 暂时不处理,跳过`);
            return;
        }
        //更新banner刷新
        if (this.bannerOn) {
            this.ad.show().then(() => {
                console.log('banner 广告显示成功');
            }).catch((err) => {
                console.log(`展示banner失败:${err}`);
                //失败，重新加载
                this.loadAd();
            });
        } else {
            this.ad.hide();
        }
    }

}

let minisdk = {};

//初始化sdk
minisdk.initSdk = (success) => {
    minisdk.checkPrivacy(() => {
        //初始化视频广告
        videoAd.initAd(__minisdkConfig.videoParam, (delay) => intersAd.refreshNextIntersTime(delay));
        //初始化插页广告
        intersAd.initAd(__minisdkConfig.intersParam);
        //初始化banner
        bannerAd.initAd(__minisdkConfig.bannerParam);
        if (success) {
            success();
        }
    });
};

//视频广告flag
minisdk.getVideoFlag = () => {
    return videoAd.getFlag();
}

//播放视频广告
minisdk.showVideo = (scene, success, fail) => {
    videoAd.showVideo(scene, success, fail);
};

//播放插页广告
minisdk.showInters = (scene) => {
    intersAd.showInters(scene);
};

//展示banner
minisdk.showBanner = () => {
    bannerAd.showBanner();
};

//隐藏banner
minisdk.hideBanner = () => {
    bannerAd.hideBanner();
};

//事件上报
minisdk.track = (eventId, data) => {
    if (!isEnableTrack()) {
        return;
    }
    sdkLog('track', eventId, data);
    qg.uma.trackEvent(eventId, data);
};

//检查隐私协议
minisdk.checkPrivacy = (success) => {
    const key = '$minisdk_support_privacy$';
    //查看是否缓存了同意
    var state = qg.getStorageSync({
        key: key,
        default: "",
    });
    if (state == "1") {
        //已经同意隐私协议
        if (success) {
            success();
        }
    } else {
        minisdk.popUpPrivacyDialog(__minisdkConfig.privacyMessage, () => {
            qg.setStorageSync({ key: key, value: "1" });
            //同意隐私政策
            if (success) {
                success();
            }
        }, () => {
            //二次确认，是否退出游戏
            minisdk.popUpExitGame(() => { qg.exitApplication(); }, () => minisdk.checkPrivacy(success), () => minisdk.checkPrivacy(success));
        }, () => minisdk.checkPrivacy(success));
    }
}

//弹出隐私协议
minisdk.popUpPrivacyDialog = (msg, yes, no, cancel) => {
    //弹出隐私协议
    const title = "隐私政策";
    const message = msg;
    //弹出窗口提示
    qg.showDialog({
        title: title,
        message: message,
        buttons: [
            {
                text: '同意并继续',
                color: '#0082cf'
            },
            {
                text: '退出',
                color: '#e84335'
            }
        ],
        success: function (data) {
            if (data.index == 0) {
                //同意隐私协议
                if (yes) {
                    yes();
                }

            } else {
                //不同意隐私协议
                if (no) {
                    no();
                }
            }
        },
        cancel: function () {
            if (cancel) {
                cancel();
            }
        }
    });
}

//弹出退出游戏
minisdk.popUpExitGame = (yes, no, cancel) => {
    //弹出隐私协议
    const title = "温馨提示";
    const message = '退出游戏？';
    //弹出窗口提示
    qg.showDialog({
        title: title,
        message: message,
        buttons: [
            {
                text: '是',
                color: '#0082cf'
            },
            {
                text: '否',
                color: '#e84335'
            }
        ],
        success: function (data) {
            if (data.index == 0) {
                if (yes) {
                    yes();
                }

            } else {
                if (no) {
                    no();
                }
            }
        },
        cancel: function () {
            if (cancel) {
                cancel();
            }
        }
    });
};


//日志输出
function sdkLog(...prarms) {
    if (window.TP_DEBUG_MODE && window.TP_DEBUG_MODE == 'off') {
        return;
    }
    console.log(__miniSdkLogPrefix, prarms)
}

//是否开启事件上报
function isEnableTrack() {
    return __minisdkConfig.trackParam.enableTrackPlugin;
}

//初始化友盟
function initUma() {
    if (!isEnableTrack()) {
        sdkLog('*****事件上报未开启*****');
        return;
    }
    sdkLog('*****事件上报开启*****')
    const appkey = __minisdkConfig.trackParam.umaAppKey;
    __umaPlugin.init({
        appKey: appkey,
        useOpenid: false, // 因当前暂不支持openid,此处需要设置为false
        debug: false
    });
}

//sdk入口函数
function launchMiniSdk() {
    initUma();
}

launchMiniSdk();
window['minisdk'] = minisdk;



