import { Adapter } from "../adapter/Adapter";
import { Constants } from "../data/Constants";

const WX_CONFIG = {
    AD_ID: {
        /** banner广告 */
        banner: 'adunit-fa7b08ac6d8cf200',
        /** 视频广告 */
        video: 'adunit-29b5f0955ee77f59',
        /** 插屏广告 */
        interstitial: 'adunit-a3615ebe31eba64a',
        /** 原生模板多个格子广告 */
        multiGridCustom: 'adunit-xxx',
         /** 原生模版单格格子广告 */
        sigleGridCustom: 'adunit-d4f43001efd879de',
    }
}

const delayTime: number = 1900;
class PlatformWX {
    private _onHideTime: number = Infinity;
    private _rewardVideo: wx.RewardedVideoAd;
    private _bannerAd: wx.BannerAd;
    private _interstitialAd: any;
    private _customAd: any;
    private _sigleCustomAd: any;
    private _shareSuccessHandler: Function = null;
    private _videoSuccessHandler: Function = null;
    private _customAdCloseHandler: Function = null;
    private _showInterstitialAdTime: number = null;
    private _shareModalIsActive: boolean = false;
    private _shareStr: string = "东北F4来到美国西部拓荒时代，保卫城镇，完成自我救赎。";

    public initialize(): void {
        console.log("初始化微信框架");
        wx.showShareMenu({
            withShareTicket: true,
            menus: ['shareAppMessage', 'shareTimeline'],
            success: () => { },
            fail: () => { },
            complete: () => { }
        });
        //发送给朋友
        wx.onShareAppMessage(function(){
            wx.shareAppMessage({
                imageUrl: "share.jpg",
                title: this._shareStr,
                query: 'shareMsg='+'a=1',
            });
        }.bind(this));

        wx.onShow((res: {
            scene: string;
            query: any;
            shareTicket: string;
            referrerInfo: wx.ReferrerInfo;
        }) => {
            if (this._shareSuccessHandler == null) return;
            if (this._shareModalIsActive) return;
            if (Date.now() - this._onHideTime >= delayTime) {
                if (this._shareSuccessHandler) this._shareSuccessHandler(true);
            } else {
                wx.showModal({
                    title: '分享提示',
                    content: '成功分享到群即可获得奖励',
                    success: (res) => {
                        if (res.confirm) {
                            this.shareShowReward(this._shareSuccessHandler(false));
                        } else if (res.cancel) {
                            this._shareSuccessHandler = null;
                        }
                        this._shareModalIsActive = false;
                    }
                });
                this._shareModalIsActive = true;
            }
            this._onHideTime = Infinity;
        });

        //this.__createBannerAd();
        this.__createVideoAd();
        //this.__createCustomAd();
        //this.__createSigleCustomAd();
        //this.__createInterstitialAd();
        //this.__customAdExist();
        //this.__customSigleAdExist();
    }


    public showToast(param: { title: string, icon?: 'success' | 'loading' | 'none', image?: string, duration?: number, mask?: boolean, success?: (res?: any) => void, fail?: (res?: any) => void, complete?: (res?: any) => void }): void {
        let finalParam = {
            title: '',
            icon: 'none',
            duration: 2000,
        } as any;
        Object.assign(finalParam, param);
        wx.showToast(finalParam);
    }

    public shareAppMessage(param: { title?: string, imageUrl?: string, query?: string, imageUrlId?: string } = {}): void {
        wx.shareAppMessage(param);
    }

    public vibrateShort(param: any = {}): void {
        wx.vibrateShort(param);
    }

    public vibrateLong(param: any = {}): void {
        wx.vibrateLong(param);
    }


    /**
     * 是否支持添加桌面
     * @returns 
     */
    public isSupportDesk(){
        //@ts-ignore
        if (wx.canAddToFavorites) {
            return true;
        }else{
            return false;
        }
    }
    
    //添加到桌面
    public addDesk(){
        //@ts-ignore
        if (wx.canAddToFavorites) {
            //@ts-ignore
            wx.canAddToFavorites({
                success(res) {
                    if (res.canAdd) {
                        //可以添加到桌面
                        //@ts-ignore
                        wx.addToFavorites({
                            // 小程序的相关信息
                            title: Constants.gameName,
                            query: '', // 可以携带参数
                            success() {
                                this.showToast({title: '添加到桌面成功'});
                            },
                            fail(err) {
                                this.showToast({title: '添加到桌面失败', err});
                            }
                        });
                    } else {
                        // 不支持添加到桌面
                        this.showToast({title: '当前环境不支持添加到桌面'});
                    }
                },
                fail(err) {
                    this.showToast({title: '检查添加到桌面权限失败', err});
                }
            });
        } else {
            this.showToast({title: "当前环境不支持添加到桌面"});
        }
    }

    //分享
    public shareShowReward(handler: Function = null): void {
        if(handler){
            this._shareSuccessHandler = handler;
        }
        this._onHideTime = Date.now();
        this.shareAppMessage({
            imageUrl: "share.jpg",
            title: this._shareStr, 
            query: 'shareMsg='+'a=1',
        });
    }

    public showRewardVideo(handler: Function = null): void {
        //console.log('当日视频次数： ', ArchiveSystem.localData.videoRewardTimesToday);
        /*if (ArchiveSystem.localData.videoRewardTimesToday % 2 === 1) {
            cc.log(ArchiveSystem.localData.videoRewardTimesToday, '转为分享');
            this.__turnVideoToShare(handler);
            return;
        }*/
        if (!this._rewardVideo) {
            this.__turnVideoToShare(handler);
            return;
        }
        this._videoSuccessHandler = handler;
        this._rewardVideo
            .show()
            .then(() => {
                console.log("视频播放成功");
            })
            .catch(err => {
                this._rewardVideo.load()
                    .then(() => {
                        this._rewardVideo
                            .show()
                            .then(() => {
                                console.log("视频重新加载，播放成功");
                            });
                    })
                    .catch(err2 => {
                        this._videoSuccessHandler?.(false);
                        this.shareShowReward(handler);
                        this._videoSuccessHandler = null;
                    });
            });
    }

    public showBannerAd(): void {
        if (!this._bannerAd) return;
        const { screenWidth, screenHeight } = wx.getSystemInfoSync();
        this._bannerAd.show()
            .then(() => {
                this._bannerAd.style.left = (screenWidth - this._bannerAd.style.realWidth) / 2;
                this._bannerAd.style.top = screenHeight - this._bannerAd.style.realHeight;
            }).catch((e: any) => {
                console.log('banner广告显示出错', e);
            });
    }

    public hideBannerAd(recreate: boolean = false): void {
        if (!this._bannerAd) return;
        this._bannerAd.hide();
        if (recreate) {
            this.refreshBannerAd();
        }
    }

    public refreshBannerAd(): void {
        if (!this._bannerAd) return;
        this._bannerAd.destroy();
        this.__createBannerAd();
    }

    public showInterstitialAd(force: boolean = false): void {
        if(force){
            if (!this._interstitialAd) return;
            this._interstitialAd.show();
        }else{
            if (!this._interstitialAd) return;
            let timeNow = Date.now();
            if (this._showInterstitialAdTime == null) {
                this._showInterstitialAdTime = timeNow;
                return;
            }
            if (timeNow - this._showInterstitialAdTime > 120 * 1000) {
                this._interstitialAd.show();
                this._showInterstitialAdTime = timeNow;
            }
        }
    }

    public showCustomAd(close: Function): void {
        if (!this._customAd) return;
        this._customAdCloseHandler = close;
        this._customAd
            .show()
            .catch((e: any) => {
                console.log('原生广告显示出错', e);
            });
    }

    public hideCustomAd(): void {
        if (!this._customAd) return;
        this._customAd
            .hide()
            .catch((e: any) => {
                console.log('原生广告隐藏出错', e);
            });
    }

    public showSigleCustomAd(): void {
        if (!this._sigleCustomAd 
            || false) return;
        this._sigleCustomAd
            .show()
            .catch((e: any) => {
                console.log('原生当个格子广告显示出错', e);
            });
    }


    public hideSigleCustomAd(): void {
        if (!this._sigleCustomAd 
            || false) return;
        this._sigleCustomAd
            .hide()
            .catch((e: any) => {
                console.log('隐藏单个格子广告出错', e);
            });
    }
    
    /**单个格子广告*/
    public __customSigleAdExist(): void {
        if(!this._sigleCustomAd){
           this.__createSigleCustomAd();
        }
        this._sigleCustomAd.show()
            .then(() => {
                if(this._sigleCustomAd.isShow()){
                    this.hideSigleCustomAd();
                }
            })
            .catch((res) => {
                if(this._sigleCustomAd.isShow()){
                    this.hideSigleCustomAd();
                }
            });
    }

    /**多个格子广告*/
    public __customAdExist(): void {
        if(!this._customAd){
           this.__createCustomAd();
        }
        this._customAd.show()
            .then(() => {
                if(this._customAd.isShow()){
                    this.hideCustomAd();
                }
            })
            .catch((res) => {
                if(this._customAd.isShow()){
                    this.hideCustomAd();
                }
            });
    }

    public exitGame(): void {
        wx.exitMiniProgram({});
    }


    private __createVideoAd(): void {
        if (!WX_CONFIG.AD_ID.video) return;
        this._rewardVideo = wx.createRewardedVideoAd({ adUnitId: WX_CONFIG.AD_ID.video });
        // 注册视频的onClose事件
        this._rewardVideo.onClose(res => {
            if (res && res.isEnded || res === undefined) {
                this._videoSuccessHandler?.(true);
            } else {
                this.showToast({
                    title: "完整观看视频才有奖励哦"
                });
                this._videoSuccessHandler?.(false);
            }
            this._videoSuccessHandler = null;
        });
        // 注册视频的onError事件
        this._rewardVideo.onError(res => {
            this._videoSuccessHandler?.(false);
            this.showToast({
                title: "暂时没有可观看的视频"
            });
            this.shareShowReward(this._videoSuccessHandler);
            this._videoSuccessHandler = null;
        });
    }

    private __createBannerAd(): void {
        if (!WX_CONFIG.AD_ID.banner) return;
        let info = wx.getSystemInfoSync();
        let f = Adapter.isNormalScreen();
        let w = f ? info.screenWidth * 0.85 : info.screenWidth * 0.85;
        this._bannerAd = wx.createBannerAd({
            adUnitId: WX_CONFIG.AD_ID.banner,
            adIntervals: 48,
            style: {
                left: 0,
                top: info.screenHeight, 
                width: w,
                height: 70 //w * (f ? 0.48 : 0.5) //原始0
            }
        });
        this._bannerAd.onError(err => {
            switch (err.errCode) {
                case 1001: {

                    break;
                }

                case 1004: {

                    break;
                }
            }
        });
        this._bannerAd.onResize(() => {});
    }

    private __createInterstitialAd(): void {
        if (!WX_CONFIG.AD_ID.interstitial) return;
        this._interstitialAd = wx.createInterstitialAd({ adUnitId: WX_CONFIG.AD_ID.interstitial });
    }

    private __createCustomAd(): void {
        if (!WX_CONFIG.AD_ID.multiGridCustom) return;
        let info = wx.getSystemInfoSync();
        this._customAd = wx.createCustomAd({
            adUnitId: WX_CONFIG.AD_ID.multiGridCustom,
            adIntervals: 60,
            style: { 
                left: 0, 
                top: info.screenHeight * 0.16,
                with: info.screenWidth * 0.9
            }
        });
        if(this._customAd){
            this._customAd.onHide(res => {
                if(this._customAdCloseHandler){this._customAdCloseHandler()};
            });
            this._customAd.onError(err => {
                switch (err.errCode) {
                    case 1001: {
    
                        break;
                    }
    
                    case 1004: {
    
                        break;
                    }
                }
            }); 
        }
    }

    private __createSigleCustomAd(): void {
        if (!WX_CONFIG.AD_ID.sigleGridCustom) return;
        let info = wx.getSystemInfoSync();
        let f = Adapter.isNormalScreen();
        this._sigleCustomAd = wx.createCustomAd({
            adUnitId: WX_CONFIG.AD_ID.sigleGridCustom,
            adIntervals: 60,
            style: { 
                left: info.screenWidth * 0.49, 
                top: info.screenHeight * 0.038 + (f ? 20 : 35)
            }
        });
        this._sigleCustomAd.onError(err => {
            console.log('展示格子广告失败1');
        });  
    }

    private __turnVideoToShare(handler: Function): void {
        this.shareShowReward(handler);
        this._videoSuccessHandler = null;
    }
}

export default new PlatformWX();