import { MiniGameSdk } from "../../Sdk/MiniGameSdk";

export default class Utils {
    static uid: string = "";
    static session_key = "";
    static appid: string = "";
    static openid: string = "";
    static outTradeNo: string = "";
    static httpip: string = `https://laf.nika4games.com/`;
    //#region  安卓支付 
    /**获取用户信息*/
    static getUserInfo(callBack) {
        wx.login({
            success(res) {
                console.log("登录成功");
                console.log(res);
                if (res.code) {
                    Utils.POST("login", { code: res.code }, ret => {
                        console.log("请求结果：", res);
                        console.log(ret);
                        Utils.openid = ret.data.openid;
                        Utils.session_key = ret.data.session_key;
                        Utils.uid = ret.data._id;
                        callBack(ret);
                    })
                } else {
                    console.log('登录失败！' + res.errMsg)
                }
            }
        })
    }

    /**道具直购接口*/
    static buyProp(id, count, price, callBack) {
        console.log("请求uid:" + Utils.uid, "请求id:" + id, "请求数量:" + count, "请求价格:" + price);

        Utils.POST("wx/orderPaySig", { uid: Utils.uid, itemid: id, itemCount: count, itemPrice: price }, res => {
            if (res.code == 1) {
                Utils.outTradeNo = res.data.outTradeNo;
                // let timeoutId: number;
                // const timeoutDuration = 30000; // 30 秒超时时间
                // // 设置超时定时器
                // timeoutId = setTimeout(() => {
                //     console.error('支付请求超时');
                //     callBack("请求支付超时");
                // }, timeoutDuration);
                //@ts-ignore
                wx.requestMidasPaymentGameItem({
                    signData: res.data.signData,
                    paySig: res.data.paySig,
                    signature: res.data.signature,
                    success(res, errCode) {
                        // clearTimeout(timeoutId); // 清除超时定时器
                        console.log('成功', res, errCode);
                        callBack(res);
                    },
                    fail({ errMsg, errCode }) {
                        // clearTimeout(timeoutId); // 清除超时定时器
                        console.log('失败');
                        console.log(errMsg, errCode)
                        let data = {
                            errMsg: errMsg,
                            errCode: errCode,
                            err: "请求支付失败",
                        }
                        callBack(data);
                    }
                })
            }

        });


    }
    static getPayInfo(callBack) {
        const delays = [1000, 3000, 6000, 9000, 12000];// 延迟时间数组
        let attempt = 0; // 轮询次数

        const poll = () => {
            if (attempt >= delays.length) {
                MiniGameSdk.API.showToast("网络异常，如付款成功，重进游戏可领取奖励");
                callBack({ code: 0, data: { pay_state: -1 }, message: '轮询超时' });
                return;
            }

            console.log("请求uid:", Utils.uid);
            console.log("outTradeNo:", this.outTradeNo);
            Utils.POST("wx/getPayInfo", { uid: Utils.uid, outTradeNo: Utils.outTradeNo }, res => {
                console.log("查询字符结果:", res);
                if (res.code === 1 && (res.data.pay_state === 1 || res.data.pay_state === 2)) {
                    callBack(res);
                } else {
                    attempt++;
                    setTimeout(poll, delays[attempt - 1]);
                }
            });
        };

        poll();
    }

    static setPayInfo(callBack, order) {
        const delays = [1000, 3000, 6000, 9000, 12000];// 延迟时间数组
        let attempt = 0; // 重试次数
        const sendRequest = () => {
            if (attempt > delays.length) {
                // 达到最大重试次数，调用回调并返回错误信息
                callBack({ code: 0, message: '请求失败，已达到最大重试次数' });
                return;
            }
            let orderTemp = Utils.outTradeNo;
            if (order) orderTemp = order;
            Utils.POST("wx/getOrderReward", { outTradeNo: orderTemp }, res => {
                console.log("告知服务器发货:", res);
                if (res.code === 1) {
                    console.log("告知服务器发货成功:", res);
                    // 请求成功，调用回调并返回结果
                    callBack(res);
                } else {
                    // 请求失败，增加重试次数并设置下一次请求的延迟
                    console.log("告知服务器发货失败:", res);
                    attempt++;
                    if (attempt <= delays.length) {
                        setTimeout(sendRequest, delays[attempt - 1]);
                    } else {
                        callBack({ code: 0, message: '请求失败，已达到最大重试次数' });
                    }
                }
            });
        };
        sendRequest();
    }


    //#region  ios支付

    /**跳转客服*/
    static GoKEFu(iosPayInfo, callBack) {
        cc.fx.GameConfig.GM_INFO.iosOutTradeNo = null;
        cc.fx.GameConfig.GM_INFO.iosOutTradeNo = `wcx_` + Math.round(Math.random() * 10 ** 13) + Date.now();
        const data = {
            tpye: "ios",
            outTradeNo: cc.fx.GameConfig.GM_INFO.iosOutTradeNo,
            propName: iosPayInfo.payment_name,
            count: iosPayInfo.payment_count,
            price: iosPayInfo.price,//价格单位是分
        }
        const shushu_data = {
            outTradeNo: cc.fx.GameConfig.GM_INFO.iosOutTradeNo,
            price: iosPayInfo.price,
            payment_name: iosPayInfo.payment_name,
            payment_num: iosPayInfo.payment_count,
            type: "ios",
        }
        cc.fx.GameTool.shushu_Track("init_order", shushu_data);
        //@ts-ignore
        wx.openCustomerServiceConversation({
            sessionFrom: JSON.stringify(data), // 会话来源（可选）
            showMessageCard: false, // 是否展示消息卡片
            success() {
                callBack();
                console.log('客服会话已打开');
            },
            fail() {
                callBack();
            }
        });
    }
    static getIosPayInfo(order, callBack) {
        const delays = [1000, 3000, 6000, 9000, 12000];// 延迟时间数组
        let attempt = 0; // 轮询次数
        const iosOutTradeNo = order;

        const poll = () => {
            if (attempt >= delays.length) {
                MiniGameSdk.API.showToast("网络异常，如充值成功，重进游戏可领取奖励");
                callBack({ code: 2, data: null, message: '轮询超时' });
                return;
            }

            console.log("请求uid:" + Utils.uid);
            console.log("outTradeNo:" + iosOutTradeNo);
            Utils.POST("wx/iosgetPayInfo", { outTradeNo: iosOutTradeNo }, res => {
                console.log("查询字符结果IOS");
                console.log(res);
                if (res.code === 1) {
                    callBack(res);
                } else if (res.code === 0) {
                    callBack(res);
                }
                else {
                    attempt++;
                    setTimeout(poll, delays[attempt - 1]);
                }
            });
        };

        poll();
    }

    //#endregion

    //#region 微信云
    //    static initServer(){
    //       if(cc.sys.platform!=cc.sys.WECHAT_GAME)return;
    //       //@ts-ignore
    //         wx.cloud.init({
    //             env: 'cloudbase-1gl7iex89268f11e'
    //         })
    //    }

    //    static getUserCode(){
    //     //@ts-ignore
    //         wx.login({
    //             success (res) {
    //                 console.log("登录成功");
    //                 console.log(res);
    //             if (res.code) {
    //                 //@ts-ignore
    //                     wx.cloud.callFunction({
    //                         // 云函数名称
    //                         name: 'login',
    //                         // 传给云函数的参数
    //                         data: {
    //                             code:res.code,
    //                         },
    //                         success: function(ret) {
    //                             console.log("请求成功");
    //                             console.log("请求结果：");
    //                             console.log(ret);
    //                             Utils.openid=ret.data.openid;
    //                             Utils.session_key=ret.data.session_key;
    //                             Utils.uid=ret.data._id;
    //                         },
    //                         fail:function(res){
    //                             console.log("请求失败");
    //                             console.log(res);
    //                         }
    //                     })
    //                 } else {
    //                     console.log('登录失败！' + res.errMsg)
    //                 }
    //             }
    //         })
    //    }

    //    static PayOder(){
    //        if(cc.sys.platform!=cc.sys.WECHAT_GAME)return;
    //        //@ts-ignore
    //         wx.cloud.callFunction({
    //             // 云函数名称
    //             name: 'userPayOrder',
    //             // 传给云函数的参数
    //             data: {
    //                 itemid:"10011",
    //                 itemCount:1,
    //                 itemPrice:100
    //             },
    //             success: function(res) {
    //                 console.log("请求成功");
    //                 console.log(res)
    //                 if(res.result.code==1){
    //                     Utils.outTradeNo=res.result.data.outTradeNo;
    //                     console.log("订单号："+Utils.outTradeNo);
    //                     //@ts-ignore
    //                     wx.requestMidasPaymentGameItem({
    //                         signData:res.result.data.signData,
    //                         paySig: res.result.data.paySig,
    //                         signature: res.result.data.signature,
    //                         success(res, errCode) {
    //                             console.log('成功', res, errCode);
    //                         },
    //                         fail({errMsg,errCode}) {
    //                             console.error('失败');
    //                             console.error(errMsg, errCode)
    //                         }
    //                     })
    //                 }

    //             },
    //             fail:function(res){
    //                 console.log("请求失败");
    //                 console.log(res);
    //             }
    //         })
    //     }

    //    static getPayInfo1(callBack){
    //     if(cc.sys.platform!=cc.sys.WECHAT_GAME)return;
    //     //@ts-ignore
    //         wx.cloud.callFunction({
    //             // 云函数名称
    //             name: 'userGetPayState',
    //             // 传给云函数的参数
    //             data: {
    //                 outTradeNo:Utils.outTradeNo
    //             },
    //             success: function(res) {
    //                 console.log("请求成功");
    //                 console.log(res)
    //                 callBack("成功");
    //             },
    //             fail:function(res){
    //                 console.log("请求失败");
    //                 console.log(res);
    //                 callBack("失败");
    //             }
    //         })
    //     }

    //     static toke(){
    //         if(cc.sys.platform!=cc.sys.WECHAT_GAME)return;
    //         //@ts-ignore
    //         wx.cloud.callFunction({
    //             // 云函数名称
    //             name: 'uerToken',
    //             // 传给云函数的参数
    //             data: {

    //             },
    //             success: function(res) {
    //                 console.log("请求成功");
    //                 console.log(res)
    //             },
    //             fail:function(res){
    //                 console.log("请求失败");
    //                 console.log(res);
    //             }
    //         })
    //     }
    //#endregion


    /**
     * POST请求
     *
     * @static
     * @param {*} url
     * @param {object} [param={}]
     * @param {*} callback
     * @memberof HttpUtil
     */
    public static POST(url, param: object | any, callback) {
        var xhr = cc.loader.getXMLHttpRequest();
        let dataStr = '';
        Object.keys(param).forEach(key => {
            dataStr += key + '=' + encodeURIComponent(param[key]) + '&';
        })
        if (dataStr !== '') {
            dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
        }
        url = this.httpip + url;
        console.log("请求地址：" + url);
        xhr.open("POST", url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4) {
                let response: any = xhr.responseText;
                if (xhr.status >= 200 && xhr.status < 300) {
                    let httpStatus = xhr.statusText;
                    // callback(true, JSON.parse(response));
                    try {
                        response = JSON.parse(response);
                    } catch {
                        response = { data: "数据有误", code: 0 };
                    }
                    callback(response);

                } else {
                    callback({ data: "网络请求失败,请检查网络连接", code: 0 });
                }
            }
        };
        xhr.send(dataStr);
    }

    static http_sendRequest(path, data, handler, extraUrl = null) {
        let xhr = cc.loader.getXMLHttpRequest();
        xhr.timeout = 5000;//超时时间
        if (data == null) {
            data = {};
        }

        if (extraUrl == null) {
            //@ts-ignore
            if (Utils.isDebug) {
                extraUrl = "http://localhost:9003";
            } else {
                extraUrl = this.httpip;
            }

        }
        //解析请求路由以及格式化请求参数
        let sendtext = "?";
        for (let k in data) {
            if (sendtext != "?") {
                sendtext += "&";
            }
            sendtext += (k + '=' + data[k]);
        }
        //组装完整的URL
        let requestURL = extraUrl + "/" + path + encodeURI(sendtext);
        // console.log("发送请求:");
        // console.log(requestURL);
        //发送请求  Get形式发送请求
        xhr.open("GET", requestURL, true);
        if (cc.sys.isNative) {//如果是手机就设置请求头
            xhr.setRequestHeader("Accept-Encoding", "gzip,deflate");
        }
        //计时判断是否超时
        let hasRetried = false;
        let timer = setTimeout(function () {
            //xhr.hasRetried=true;
            hasRetried = true;
            xhr.abort();
            console.log("http timeOut......");
            retryFun();
        }, 5000);
        //重新发送请求
        let retryFun = function () {
            Utils.http_sendRequest(path, data, handler, extraUrl);
        }
        //监听反馈
        xhr.onreadystatechange = function () {
            clearTimeout(timer);
            if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) {
                let ret = null;
                let respText = xhr.responseText;
                try {
                    ret = JSON.parse(respText);
                } catch (e) {
                    console.log("http error:" + e);
                    ret = {
                        code: 1,
                        msg: e
                    }
                }
                if (handler) {
                    handler(ret);
                }
                handler = null;
            } else if (xhr.readyState === 4) {
                // if(xhr.hasRetried){
                //     return;
                // }
                if (hasRetried) {
                    return;
                }
                console.log('other readystate ==' + xhr.readyState + ', status:' + xhr.status);
                if (xhr.readyState == 4 && xhr.status == 0) {
                    handler({
                        err: 1,
                        msg: "网络连接失败，请稍后再试"
                    });
                    return;
                }
                setTimeout(function () {
                    retryFun();
                }, 5000);
            } else {
                //console.log('other readystate:' + xhr.readyState + ', status:' + xhr.status);
            }
        }
        try {
            xhr.send();
        } catch (e) {
            retryFun();
        }
        return xhr;
    }


    // const propName={
    //   gold_1: "金币包1",
    //   gold_2: "金币包2",
    //   gold_3: "金币包3",
    //   gold_4: "金币包4",
    //   gold_5: "金币包5",
    //   gold_6: "金币包6",
    //   unlimited_health_bundle_1:"无限体力组合包1",
    //   unlimited_health_bundle_2:"无限体力组合包2",
    //   unlimited_health_bundle_3:"无限体力组合包3",
    //   freeze_in_game:"局内购买冻结",
    //   hammer_in_game:"局内购买锤子",
    //   wand_in_gamerefill:"局内购买魔棒", 
    //   health:"补满体力"
    // };
}
