let __logPrefix = "##typhoon_mini_sdk";
let __debugMode = true;

//typhoon 微信小游戏sdk
let performance = wx.getPerformance();
let systemInfo = wx.getSystemInfoSync();
let screenWidth = systemInfo.screenWidth;
let screenHeight = systemInfo.screenHeight;
console.log('屏幕宽高', screenWidth, screenHeight);


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

//视频广告
let videoAd = {
    rewardedVideoAd: null,
    flag: false,
    adResult: null,
    reloadDelayCode: -1,
    adParam: null,
    isEnable: true,
    resetIntersCoolFunc: null,//重置插页冷却代理
    //初始化
    initAd: function (param, func) {
        this.adParam = param;
        this.resetIntersCoolFunc = func;
        this.isEnable = param.adUnit.length > 0;
        if (!this.isEnable) {
            log('视频广告未开启');
            return;
        }
        log("init", param, wx);
        console.log('视频参数', param);
        this.rewardedVideoAd = wx.createRewardedVideoAd({ adUnitId: param.adUnit });
        this.rewardedVideoAd.onLoad(() => {
            log('激励视频 广告加载成功');
            this.flag = true;
        });
        this.rewardedVideoAd.onError(err => {
            this.flag = false;
            log('激励视频拉取失败', err);
            clearTimeout(this.reloadDelayCode);
            log('5s后重试', err);
            this.reloadDelayCode = setTimeout(() => {
                this.rewardedVideoAd.load();
            }, 5000);
        });
        this.rewardedVideoAd.onClose(res => {
            this.flag = false;
            // 小于 2.1.0 的基础库版本，res 是一个 undefined
            if (res && res.isEnded || res === undefined) {
                // 正常播放结束，可以下发游戏奖励
                if (this.adResult != null) {
                    this.adResult(true);
                }
            }
            else {
                // 播放中途退出，不下发游戏奖励
                if (this.adResult != null) {
                    this.adResult(false);
                }
            }

        })

    },
    getFlag: function () {
        return this.flag;
    },

    showVideo: function (scene, success, fail) {
        if (!this.isEnable) {
            fail('视频广告未开启');
            return;
        }
        //TODO//上报打点scene
        log('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,
    initAd: function (param) {
        this.adParam = param;
        this.isEnable = param.adUnit.length > 0;
        console.log('插页参数', this.adParam);
        if (!this.isEnable) {
            log('插页广告未开启');
            return;
        }
        this.loadAd();
    },
    loadAd: function () {
        if (this.interstitialAd != null) {
            this.interstitialAd.destroy();
        }
        this.flag = false;
        clearTimeout(this.reloadDelayCode);
        this.interstitialAd = wx.createInterstitialAd({ adUnitId: this.adParam.adUnit });
        this.interstitialAd.onLoad(() => {
            log('inters onLoad')
            this.flag = true;
        });
        this.interstitialAd.onError(err => {
            log('inters onError', err);
            log('5s后重试', err);
            this.reload();
        });
        this.interstitialAd.onClose(res => {
            log('inters onClose');
            this.flag = false;
            this.refreshNextIntersTime(this.adParam.delay);
        });
    },
    showInters: function (scene) {
        log('showInters', scene);
        if (!this.isEnable) {
            log('插页广告未开启');
            return;
        }
        if (this.interstitialAd == null) {
            return;
        }
        const now = performance.now();
        if (now < this.nextTime) {
            log(`showInters 失败,未达到插屏冷却，${this.nextTime - now}ms 后再试`);
            return;
        }
        if (this.flag == false) {
            log('showInters 失败, flag: ', this.flag);
            return;
        }
        log('showInters show...');
        this.flag = false;
        this.interstitialAd.show().then(() => {
            log('插屏广告展示完成');
            this.refreshNextIntersTime(this.adParam.delay);
        }).catch((err) => {
            log('showInters 错误', err);
            this.loadAd();
        });
    },
    reload: function () {
        log('inters 重新加载');
        this.flag = false;
        clearTimeout(this.reloadDelayCode);
        //等待5秒后重新拉取
        this.reloadDelayCode = setTimeout(() => {
            this.interstitialAd.load();
        }, 5000);
    },
    refreshNextIntersTime: function (delay) {
        log(`inters 更新下一次展示时间 ${delay} s`);
        let next = performance.now() + delay * 1000;
        if (next > this.nextTime) {
            this.nextTime = next;
        }
        log(`下次时间${this.nextTime}`);
    }
}

//banner条广告
let bannerAd = {
    ad: null,
    adParam: null,
    loaded: false,
    reloadDelayCode: -1,
    bannerOn: false,
    isEnable: true,
    initAd: function (param) {
        this.adParam = param;
        this.isEnable = param.adUnit.length > 0;
        console.log('Banner参数', this.adParam);
        if (!this.isEnable) {
            log('Banner广告未开启');
            return;
        }
        this.loadAd();
    },
    loadAd: function () {
        this.loaded = false;
        if (this.ad != null) {
            this.ad.destroy();
        }
        clearTimeout(this.reloadDelayCode);
        //竖屏游戏
        var style = {
            width: screenWidth,
            height: 72,
            top: 0,
            left: 0,
        }

        this.ad = wx.createBannerAd({
            adUnitId: this.adParam.adUnit,
            style: style,
            adIntervals: this.adParam.interval,
        });

        this.ad.onLoad(() => {
            log('banner 加载完毕')
            this.loaded = true;
            this.updateBannerRenderer();
        });
        this.ad.onError(err => {
            log('banner 加载失败', err);
            log('5s后重试', err);
            this.loaded = false;
            this.reloadDelayCode = setTimeout(() => {
                this.loadAd();
            }, 5000);
        });
        this.ad.onResize(res => {
            if (this.adParam.mode == "top") {
                //顶部banner
                this.ad.style.top = 0;
                this.ad.style.left = 0;
            } else {
                this.ad.style.top = screenHeight - res.height;
                this.ad.style.left = 0;
                console.log('底部banner', this.ad.style)
            }
            console.log("大小", res.width, res.height)
            console.log('真实大小', this.ad.style.realWidth, this.ad.style.realHeight)
        })

    },
    showBanner: function () {
        log('showBanner');
        if (!this.isEnable) {
            log('Banner广告未开启');
            return;
        }
        this.bannerOn = true;
        this.updateBannerRenderer();
    },
    hideBanner: function () {
        log('hideBanner');
        if (!this.isEnable) {
            log('Banner广告未开启');
            return;
        }
        this.bannerOn = false;
        this.updateBannerRenderer();
    },
    updateBannerRenderer: function () {
        log('updateBannerRenderer...');
        if (this.ad == null) {
            log(`Banner ad  is null 暂时不处理,跳过`);
            return;
        }
        if (this.loaded == false) {
            log(`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 = () => {
    //初始化视频广告
    videoAd.initAd(minisdkConfig.videoParam, (delay) => intersAd.refreshNextIntersTime(delay));
    //初始化插页广告
    intersAd.initAd(minisdkConfig.intersParam);
    //初始化banner
    bannerAd.initAd(minisdkConfig.bannerParam);
};

//视频广告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) => {
    log('track', eventId, data);
    wx.reportEvent(eventId, data);
};

//日志输出
function log(...prarms) {
    if (__debugMode) {
        console.log(__logPrefix, prarms)
    }
}

window['minisdk'] = minisdk;



