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.zxbw.modulemain.R
import com.zxbw.modulemain.adapter.RightsDetailListAdapter
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 RightsDetailActivity : BaseActivity(), RightsDetailContract.View, RightsPayContract.View,
    OnRecycleItemClickListener<RightsDetailEntity> {

    private var mPayPresenter: RightsPayPresenter? = null
    private var mPresenter: RightsDetailPresenter? = null
    private var mAdapter: RightsDetailListAdapter? = 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() {
        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)
        }

        mAdapter = RightsDetailListAdapter(this, this)
        id_rcl_vip_package_list.layoutManager = GridLayoutManager(this, 3)
        id_rcl_vip_package_list.adapter = mAdapter

        mPresenter?.geRightsDetail(brandName)
    }


    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>) {
        mAdapter?.clear()
        mAdapter?.appendToList(result)
        mAdapter?.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?) {
        mAdapter?.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!!)
    }

}