package com.zxbw.modulemain.activity

import android.content.Intent
import android.graphics.Paint
import android.os.Handler
import android.text.TextUtils
import android.util.Log
import android.view.KeyEvent
import android.view.View
import android.webkit.*
import com.pay.paytypelibrary.base.OnPayResultListener
import com.pay.paytypelibrary.base.OrderInfo
import com.pay.paytypelibrary.base.PayUtil
import com.zxbw.modulemain.R
import com.zxbw.modulemain.contract.CardDetailContract
import com.zxbw.modulemain.presenter.CardDetailPresenter
import com.zxbw.modulemain.view.DialogUtils
import com.zxhl.cms.AppContext
import com.zxhl.cms.common.Constant
import com.zxhl.cms.common.base.BaseActivity
import com.zxhl.cms.net.SettingPreference
import com.zxhl.cms.net.model.qy.RightsDetailEntity
import com.zxhl.cms.net.model.uc.AliPayEntity
import com.zxhl.cms.net.model.uc.PayResultEntity
import com.zxhl.cms.pay.H5PayUtil
import com.zxhl.cms.pay.PaymentConfig
import com.zxhl.cms.pay.alipay.AlipayServer
import com.zxhl.cms.utils.EventUtils
import com.zxhl.cms.utils.JumpUtils
import com.zxhl.cms.utils.MainLooper
import com.zxhl.cms.utils.RxBus
import com.zxhl.cms.widget.LoadingDialog
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_layout_card_detail.*
import kotlinx.android.synthetic.main.activity_layout_card_detail.id_img_back
import kotlinx.android.synthetic.main.activity_layout_card_detail.id_img_close_pay_web
import kotlinx.android.synthetic.main.activity_layout_card_detail.id_rights_pay_web_view
import kotlinx.android.synthetic.main.activity_layout_card_detail.id_rl_h5_pay_view

class CardDetailActivity : BaseActivity(), CardDetailContract.View {
    private var mPayPresenter: CardDetailPresenter? = null
    private var mLoading: LoadingDialog? = null
    private var pay_type: Int? = PaymentConfig.H5_PAY
    private var payResultObservable: Observable<PayResultEntity>? = null
    var goodsID: String? = ""
    var type: String? = "0"
    var skill: Boolean? = false
    var outTradeNo: String? = ""
    override fun onClick(v: View?) {

    }

    override fun before() {
        super.before()
        setStatusBarBackground(AppContext.get().resources.getColor(R.color.transparent))
    }

    override fun layoutID(): Int {
        return R.layout.activity_layout_card_detail
    }

    override fun init() {
        val cardbean: RightsDetailEntity =
            intent.getSerializableExtra("cardbean") as RightsDetailEntity
        type = intent.getStringExtra("type")
        outTradeNo = intent.getStringExtra("outTradeNo")
        skill = intent.getBooleanExtra("skill", false)
        Log.e("MXL", "skill" + skill)
        initPay()
        goodsID = cardbean.id
        id_img_back?.setOnClickListener {
            if (TextUtils.equals(type, "1")) {
                // 在这里，拦截或者监听Android系统的返回键事件。
                DialogUtils.showExitSkillBuy(this, View.OnClickListener {
                    finish()
                })
            } else {
                finish()
            }
        }
        id_ll_pay?.setOnClickListener {
            toPay()
        }
        id_img_close_pay_web.setOnClickListener {
            id_rl_h5_pay_view.visibility = View.GONE
        }
        setView(cardbean)
    }

    fun setView(bean: RightsDetailEntity) {
        id_tv_card_name?.text = "${bean.brand}${bean.goodsName}${bean.category}"
        id_tv_cards_name?.text = "${bean.brand}${bean.goodsName}${bean.category}"
        id_tv_cagte_name?.text = bean.category
        id_tv_card_discount?.text = "会员专享${bean.costDiscount}折"
        id_tv_card_price?.text = "${bean.salePrice}"
        id_tv_guanfang_price?.text = "官方价 ¥${bean.originPrice}元"
        id_tv_guanfang_price?.getPaint()?.setFlags(Paint.STRIKE_THRU_TEXT_FLAG) //中划线
        id_tv_pay_price?.text = "${bean.skillPrice}"
        id_tv_jiesheng_price?.text = "立省${bean.costPrice}元"
    }

    fun initPay() {
        mPayPresenter = CardDetailPresenter(this)
        mLoading = LoadingDialog.getLoadingDialog(
            this,
            getString(com.zxhl.cms.R.string.wait_ing),
            false,
            false
        )
        payResultObservable = RxBus.get().register(Constant.PAY_RESULT, PayResultEntity::class.java)
        payResultObservable?.observeOn(AndroidSchedulers.mainThread())
            ?.subscribe(Consumer<PayResultEntity> { obj ->
                MainLooper?.get()?.postDelayed(Runnable {
                    mHandler?.removeCallbacksAndMessages(null)
                }, 1000)
                Log.d("qqbs", "verifyPay:${obj.txt}")
                //println("verifyPay payResultObservable------------------------------- order:${obj.txt}")
                if (obj.isPaySuc) {
                    EventUtils.onEvent("pay_page_pay_query_order", "付款成功")
                    mPayPresenter?.verifyPay(obj.txt, obj.payType)
                } else {
                    //支付宝支付
                    if (obj.payType == 1) {
                        if (obj.payStatus == "6001") {
                            EventUtils.onEvent("zfb_pay_cancel")
                        } else {
                            EventUtils.onEvent("zfb_pay_error", obj.payStatus + " msg:" + obj.txt)
                        }
                    } else {
                        EventUtils.onEvent("wx_pay_error", obj.txt)
                    }
                    showResultLoading(false)
                }
            }, Consumer<Throwable> { })

        var result = SettingPreference.getConfig()
        if (result != null) {
            if (result != null && !result.pay_config_v2.isNullOrEmpty()) {
                for (i in result.pay_config_v2!!.indices) {
                    if (result?.pay_config_v2!![i].open == 1) {
                        pay_type = result?.pay_config_v2!![i].type
                        break
                    }
                }
            }
        }
    }

    private var mHandler: Handler = Handler {
        when (it.what) {
            0 -> {
                if (mLoading != null) {
                    mLoading?.setResult(false, "取消支付", 1000)
                }
            }
            1 -> {
                if (mLoading != null) {
                    mLoading?.setResult(false, "支付异常", 0)
                }
                id_rl_h5_pay_view.visibility = View.VISIBLE
                EventUtils.onEvent("h5_pay_end")
            }
            2 -> {
                if (mLoading != null) {
                    mLoading?.setResult(false, "支付异常", 0)
                }
                id_rl_h5_pay_view.visibility = View.VISIBLE
            }
        }
        false
    }

    fun toPay() {
        isClickPayBtn = true
        mLoading?.setLoading("请稍后...")
        mLoading?.show()
        mPayPresenter?.requestRightsAliPay("xxsqshop://carddetail",
            goodsID.toString(),
            pay_type.toString(),
            "",
            "51",
            skill,
            outTradeNo
        )
    }

    override fun requestOrderSuc(result: AliPayEntity) {
        if (pay_type == PaymentConfig.MIN_PAY_PROGRAM) {
            SettingPreference.setOutTradeNo(result?.outTradeNo)
            JumpUtils.h5Jump("https://api.minpayment.com/pay.do?sendMsg=" + result.wakeup)
        } else if (pay_type == PaymentConfig.H5_PAY) {
            SettingPreference.setOutTradeNo(result?.outTradeNo)
            if (result.outTradeNo.isNullOrEmpty()) {
                EventUtils.onEvent("h5_pay_error")
                showResultLoading(false)
            } else {
                mHandler.sendEmptyMessageDelayed(1, 8000)
                H5PayUtil().loadH5PayWeb(
                    this,
                    id_rights_pay_web_view,
                    result.outTradeNo ?: "",
                    object : H5PayUtil.H5PayCallBack {
                        override fun jumpZfbAppSuc() {
                            id_rl_h5_pay_view.visibility = View.GONE
                            EventUtils.onEvent("h5_open_zfb_suc")
                            mHandler.removeMessages(1)
                        }

                        override fun jumpZfbAppException(e: Exception) {
                            EventUtils.onEvent("h5_open_zfb_error", e.toString())
                            mHandler.removeMessages(1)
                            mHandler.sendEmptyMessage(2)
                        }

                        override fun loadH5Error1(errorStr: String) {
                            EventUtils.onEvent("h5_pay_error1", errorStr)
                        }

                        override fun loadH5Error2(errorStr: String) {
                            EventUtils.onEvent("h5_pay_error2", errorStr)
                        }
                    })
            }
        } else if (pay_type == PaymentConfig.ALI_PAY) {
            AlipayServer.payV2(this, result.wakeup!!)
        } else if (pay_type == PaymentConfig.SD_PAY) {
            SettingPreference.setOutTradeNo(result.outTradeNo)
            PayUtil.CashierPaySingle(this, result.wakeup, object : OnPayResultListener {
                override fun onSuccess(p0: OrderInfo?) {

                }

                override fun onError(p0: String?) {
                    EventUtils.onEvent("SdPayError", "error:${p0}")
                    mLoading?.setResult(false, "支付异常", 1000)
                }
            });
        } else {
            showToast("暂不支持")
            EventUtils.onEvent("payment_error", "$pay_type")
        }
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        val data = intent?.data
        if (data != null) {
            if (pay_type == PaymentConfig.SD_PAY) {
                val payCode = data.getQueryParameter("payCode")
                if (payCode == "2") {
                    isPause = false
                    mPayPresenter?.verifyPay(SettingPreference.getOutTradeNo(), pay_type!!)
                } else {
                    showResultLoading(false)
                }
            }
        }
    }

    override fun requestOrderFail(errorMsg: String) {
        showResultLoading(false)
    }

    override fun verifyOrderSuc(order: String) {
        isClickPayBtn = false
        SettingPreference.setOutTradeNo("")
        showResultLoading(true)
        finish()
        JumpUtils.PaySuceessJump()
    }

    override fun verifyOrderFail(errorMsg: String) {
        isClickPayBtn = false
        showResultLoading(false)
    }

    private fun showResultLoading(isPaySuc: Boolean) {
        if (isPaySuc) {
            mLoading?.setResult(true, "支付成功", 1000)

        } else {
            mLoading?.setResult(false, "支付失败", 1000)
        }
    }


    override fun onPause() {
        super.onPause()
        isPause = true
    }

    private var isPause = false
    private var isClickPayBtn = false
    override fun onResume() {
        super.onResume()
        if (isPause && isClickPayBtn) {
            if (pay_type == PaymentConfig.MIN_PAY_PROGRAM || pay_type == PaymentConfig.H5_PAY|| pay_type == PaymentConfig.ZFB_H5_PAY|| pay_type == PaymentConfig.WX_H5_PAY|| pay_type == PaymentConfig.HUI_FU_H5_PAY1|| pay_type == PaymentConfig.HUI_FU_H5_PAY2) {
                //如果是敏支付或者H5支付
                mPayPresenter?.verifyPay(SettingPreference.getOutTradeNo(), pay_type!!)
            } else {
                mHandler?.sendEmptyMessageDelayed(0, 2000)
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (payResultObservable != null)
            RxBus.get().unregister(Constant.PAY_RESULT, payResultObservable!!)
    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (TextUtils.equals(type, "1")) {
                // 在这里，拦截或者监听Android系统的返回键事件。
                DialogUtils.showExitSkillBuy(this, View.OnClickListener {
                    finish()
                })

            } else {
                finish()
            }

        }

        return false
    }
}