package com.zxbw.modulemain.activity

import android.content.Intent
import android.os.Handler
import android.text.Html
import android.util.Log
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.request.RequestOptions
import com.pay.paytypelibrary.base.OnPayResultListener
import com.pay.paytypelibrary.base.OrderInfo
import com.pay.paytypelibrary.base.PayUtil
import com.zx.ad.AdManager
import com.zx.ad.callback.InterertionAdListener
import com.zxbw.modulemain.R
import com.zxbw.modulemain.adapter.XymhRightsDetailListAdapter
import com.zxbw.modulemain.contract.RightsDetailContract
import com.zxbw.modulemain.contract.RightsPayContract
import com.zxbw.modulemain.presenter.RightsDetailPresenter
import com.zxbw.modulemain.presenter.RightsPayPresenter
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.net.model.uc.WeChatPayEntity
import com.zxhl.cms.pay.H5PayUtil
import com.zxhl.cms.pay.PaymentConfig
import com.zxhl.cms.pay.alipay.AlipayServer
import com.zxhl.cms.utils.*
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_rights_detail.*
import kotlinx.android.synthetic.main.activity_layout_rights_detail.id_img_back
import me.jessyan.autosize.utils.ScreenUtils
import java.text.DecimalFormat

/**
 * @author (wangXuewei)
 * @detail :权益详情
 */
class XymhRightsDetailActivity : BaseActivity(), RightsDetailContract.View, RightsPayContract.View,
    OnRecycleItemClickListener<RightsDetailEntity> {

    private var mPayPresenter: RightsPayPresenter? = null
    private var mPresenter: RightsDetailPresenter? = null
    private var mAdapterXymh: XymhRightsDetailListAdapter? = null
    private var brandName: String = "";
    private var mRightsData: RightsDetailEntity? = null
    private var mLoading: LoadingDialog? = null
    var skill: Boolean? = false
    override fun layoutID(): Int {
        return R.layout.activity_layout_rights_detail
    }

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

    override fun init() {
        showIntriAd()
        var statusBarHeight = ScreenUtils.getStatusBarHeight()
        if (statusBarHeight <= 0) {
            statusBarHeight = 40;
        }
        id_rights_detail_title_sys_bar_view.layoutParams.height = statusBarHeight
        id_rights_detail_title_sys_bar_view2.layoutParams.height = statusBarHeight
        id_img_back.setOnClickListener(this)
        id_img_back2.setOnClickListener(this)
        id_tv_buy_right.setOnClickListener(this)
        id_tv_btn_order.setOnClickListener(this)
        id_img_close_pay_web.setOnClickListener(this)

        //权益名称
        brandName = intent?.data?.getQueryParameter("brandName") ?: ""
        var brandUrl = intent?.data?.getQueryParameter("brandUrl") ?: ""
        mPresenter = RightsDetailPresenter(this)
        initPay()
        id_tv_bread_name.text = brandName
        id_tv_bread_desc.text = "${brandName}会员权益"

        Glide.with(this).load(brandUrl)
            .apply(RequestOptions.bitmapTransform(CircleCrop()))
            .into(id_img_bread_logo)

        var mAppConfig = SettingPreference.getConfig()
        if (mAppConfig != null) {
            id_tv_rights_instructions.text = Html.fromHtml(mAppConfig.card_desc)
        }

        mAdapterXymh = XymhRightsDetailListAdapter(this, this)
        id_rcl_vip_package_list.layoutManager = GridLayoutManager(this, 3)
        id_rcl_vip_package_list.adapter = mAdapterXymh

        mPresenter?.geRightsDetail(brandName)
    }
    fun showIntriAd(){
        AdManager.loadInterAd(this!!, object : InterertionAdListener {
            override fun onAdShow() {

            }

            override fun onAdError(errorMsg: String?) {
                Log.e("MXL","onAdError"+errorMsg)
            }

            override fun onAdClose() {

            }

        })
    }

    override fun onClick(v: View?) {
        when (v) {
            id_img_back -> {
                finish()
            }
            id_img_back2 -> {
                finish()
            }
            id_tv_buy_right -> {
                gotoBuy()
            }
            id_tv_btn_order -> {
                JumpUtils.MyOrderJump("")
                finish()
            }
            id_img_close_pay_web -> {
                id_rl_h5_pay_view?.visibility = View.GONE
            }
        }
    }

    override fun setRightsDetail(result: List<RightsDetailEntity>) {
        mAdapterXymh?.clear()
        mAdapterXymh?.appendToList(result)
        mAdapterXymh?.setSelectPos(0)
        mRightsData = result[0]
        id_tv_bread_price.text = "¥ ${mRightsData?.salePrice}"
        var oldPrice = mRightsData?.originPrice?.toFloatOrNull() ?: 0f
        var salePrice = mRightsData?.salePrice?.toFloatOrNull() ?: 0f
        val df = DecimalFormat("#0.00")
        id_tv_bread_save_price.text = "立省${df.format(oldPrice.minus(salePrice))}元"
    }

    override fun onItemClick(view: View?, position: Int, data: RightsDetailEntity?) {
        mAdapterXymh?.setSelectPos(position)
        mRightsData = data
        id_tv_bread_price.text = "¥ ${mRightsData?.salePrice}"
        var oldPrice = mRightsData?.originPrice?.toFloatOrNull() ?: 0f
        var salePrice = mRightsData?.salePrice?.toFloatOrNull() ?: 0f
        val df = DecimalFormat("#0.00")
        id_tv_bread_save_price.text = "立省${df.format(oldPrice.minus(salePrice))}元"
    }

    private fun gotoBuy() {
        val phoneNumber = id_edt_user_phone_number.text.toString().trim { it <= ' ' }
        if (!Constant.Switch.isOpenVip) {
            JumpUtils.MemberOrderJump()
            return
        }
        if (phoneNumber.isEmpty()) {
            showToast("请输入要兑换的手机号")
            return
        }
        if (phoneNumber.length < 11) {
            showToast("请检查要兑换的手机号")
            return
        }
        if (mRightsData == null) {
            showToast("请选择要购买的权益")
            return
        }
        isClickPayBtn = true
        mLoading?.setLoading("请稍后...")
        mLoading?.show()

        mPayPresenter?.requestRightsAliPay("xxsqshop://rights_detail",mRightsData?.id ?: "", pay_type.toString(), phoneNumber)

    }

    private var payResultObservable: Observable<PayResultEntity>? = null


    private var pay_type: Int? = PaymentConfig.H5_PAY
    private fun initPay() {
        mLoading = LoadingDialog.getLoadingDialog(
            this,
            getString(com.zxhl.cms.R.string.wait_ing),
            false,
            false
        )
        mPayPresenter = RightsPayPresenter(this)
        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
    }

    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 if (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) {
            if (result.outTradeNo.isNullOrEmpty()) {
                EventUtils.onEvent("H5AppPayError","error:outTradeNo null")
                showResultLoading(false)
            } else {
                SettingPreference.setOutTradeNo(result.outTradeNo)
                H5PayUtil().loadH5AppPay(
                    this,
                    pay_type!!,
                    result.wakeup ?: "",
                    object : H5PayUtil.H5AppPayCallBack {
                        override fun jumpAppException(e: Exception) {
                            EventUtils.onEvent("H5AppPayError", "error:${pay_type}")
                            if (pay_type == PaymentConfig.ZFB_H5_PAY||pay_type == PaymentConfig.HUI_FU_H5_PAY1) {
                                mLoading?.setResult(false, "支付失败,请安装支付宝后重试", 1000)
                            } else {
                                mLoading?.setResult(false, "支付失败,请安装微信后重试", 1000)
                            }
                        }
                    })
            }
        } else {
            showToast("暂不支持")
        }
    }

    override fun requestOrderSuc(result: WeChatPayEntity) {
        mLoading?.setLoading("正在支付")
    }

    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)
        id_rl_suc_view.visibility = View.VISIBLE
        hideKeyBoard()
    }

    override fun verifyOrderFail(errorMsg: String) {
        isClickPayBtn = false
        showResultLoading(false)
        id_rl_suc_view.visibility = View.GONE
    }

    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()
        Log.d("wxw", "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||pay_type == PaymentConfig.WECHAT_PAY) {
                //如果是敏支付或者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!!)
    }

}