package com.cheng.blzb.utils.pay

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.os.Handler
import android.os.Message
import android.text.TextUtils
import com.alipay.sdk.app.PayTask
import com.cheng.blzb.common.Constants
import com.cheng.blzb.event.PayStatusEnum
import com.cheng.blzb.event.PayStatusEvent
import com.example.base.common.RxBus
import com.example.base.extensions.toast
import com.example.base.utils.L
import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram
import com.tencent.mm.opensdk.modelpay.PayReq
import com.tencent.mm.opensdk.openapi.WXAPIFactory

@SuppressLint("StaticFieldLeak")
object PayUtils {

    var context: Context? = null

    /**
     * 微信支付
     *
     * @param result
     */
    fun toWXPay(mActivity: Activity, data: com.cheng.blzb.bean.OrderPayEntity) {
        if (data == null) {
            toast("未获取到支付信息")
            return
        }
        val api = WXAPIFactory.createWXAPI(mActivity, Constants.WechatAppId)
        val request = PayReq()
        request.appId = data.appId
        request.partnerId = data.partnerId
        request.prepayId = data.prepayId
        request.packageValue = data.`package`
        request.nonceStr = data.nonceStr
        request.timeStamp = data.timeStamp
        request.sign = data.sign
        api.sendReq(request)
    }

    /**
     * 微信小程序支付
     */
    fun toWXMPPay(mActivity: Activity, outTradeNo: String, mpAppId: String) {
        try {
            val api = WXAPIFactory.createWXAPI(mActivity, Constants.WechatAppId)
            val req = WXLaunchMiniProgram.Req()
            req.userName = mpAppId // 填小程序原始id
            req.path = "pages/index/index?outTradeNo=$outTradeNo"
            req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE
            api.sendReq(req)
        } catch (e: Exception) {
            toast("跳转支付失败，请检查是否安装最新版微信")
        }
    }

    /**
     * 支付宝
     */
    fun toAliPay(mActivity: Activity, res: String, orderId: String) {
        context = mActivity
        val payRunnable = Runnable {
            val alipay = PayTask(mActivity)
            val result = alipay.payV2(res, true)
            val msg = Message()
            msg.what = 1001//支付宝返回参数
            msg.obj = result
//            val bundle = Bundle()
//            bundle.putString("orderId", orderId)
//            msg.data = bundle
            mHandler.sendMessage(msg)
        }
        // 必须异步调用
        val payThread = Thread(payRunnable)
        payThread.start()
    }

    /**
     * 支付宝状态
     * 9000 订单支付成功
     * 8000 正在处理中，支付结果未知（有可能已经支付成功），请查询商户订单列表中订单的支付状态
     * 4000 订单支付失败
     * 5000 重复请求
     * 6001 用户中途取消
     * 6002 网络连接出错
     * 6004 支付结果未知（有可能已经支付成功），请查询商户订单列表中订单的支付状态
     * 其它   其它支付错误
     */
    @SuppressLint("HandlerLeak")
    private val mHandler: Handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                1001 -> {//支付宝返回参数
                    val payResult = PayResult(msg.obj as MutableMap<String, String>?)

                    /**
                     * 对于支付结果，请商户依赖服务端的异步通知结果。同步通知结果，仅作为支付结束的通知。
                     */
                    //{resultStatus=4000, result=, memo=系统繁忙，请稍后再试}
                    val resultInfo = payResult.result // 同步返回需要验证的信息
                    val resultStatus = payResult.resultStatus
                    // 判断resultStatus 为9000则代表支付成功
                    when {
                        TextUtils.equals(resultStatus, "9000") -> {
                            // 该笔订单是否真实支付成功，需要依赖服务端的异步通知。
                            RxBus.defaultInstance.post(PayStatusEvent(PayStatusEnum.PAY_SUCCESS))
                        }

                        TextUtils.equals(resultStatus, "6001") -> {
                            // 该笔订单是否真实支付成功，需要依赖服务端的异步通知。
                            RxBus.defaultInstance.post(PayStatusEvent(PayStatusEnum.PAY_CANCEL))
                        }

                        else -> {
                            // 该笔订单真实的支付结果，需要依赖服务端的异步通知。
                            L.d("resultStatus=${resultStatus}")
                            RxBus.defaultInstance.post(PayStatusEvent(PayStatusEnum.PAY_ERROR, resultInfo))
                        }
                    }
                }
            }
        }
    }

}
