package com.zxbw.modulemain.activity

import android.content.Intent
import android.graphics.Paint
import android.net.Uri
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.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.NetConfig
import com.zxhl.cms.common.base.BaseActivity
import com.zxhl.cms.net.SettingPreference
import com.zxhl.cms.net.model.qy.SkillGoodsEntity
import com.zxhl.cms.net.model.uc.AliPayEntity
import com.zxhl.cms.net.model.uc.PayResultEntity
import com.zxhl.cms.pay.PayActivity
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_to_pay_skill_goods.*
import kotlinx.android.synthetic.main.activity_layout_to_pay_skill_goods.id_img_back
import kotlinx.android.synthetic.main.activity_layout_to_pay_skill_goods.id_rights_pay_web_view

class ToPaySkillGoodsActivity : BaseActivity(), CardDetailContract.View {
    private var mPayPresenter: CardDetailPresenter? = null
    private var mLoading: LoadingDialog? = null
    private var pay_type: Int? = RightsDetailActivity.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_to_pay_skill_goods
    }

    override fun init() {
        val skillGoodsEntity: SkillGoodsEntity =
            intent.getSerializableExtra("skillgoods") as SkillGoodsEntity
        type = intent.getStringExtra("type")
        outTradeNo = intent.getStringExtra("outTradeNo")
        skill= intent.getBooleanExtra("skill",false)
        initPay()
        goodsID = skillGoodsEntity.goodsId
        setDataView(skillGoodsEntity)
        id_ll_skill_pay?.setOnClickListener {
            topay()
        }
        id_img_back?.setOnClickListener {
            if (TextUtils.equals(type, "1")) {
                // 在这里，拦截或者监听Android系统的返回键事件。
                DialogUtils.showExitSkillBuy(this, View.OnClickListener {
                    finish()
                })
            } else {
                finish()
            }
        }
    }

    fun setDataView(entity: SkillGoodsEntity) {
        id_title_name?.text =
            "${entity?.card?.brand}${entity?.card?.category}${entity?.card?.goodsName}"
        id_tv_goods_name?.text =
            "${entity?.card?.brand}${entity?.card?.category}${entity?.card?.goodsName}"
        id_tv_goods?.text =
            "${entity?.card?.brand}${entity?.card?.category}${entity?.card?.goodsName}"
        id_tv_price?.text = "${entity.skillPrice}"
        id_tv_yuanjia?.text = "${entity.card?.originPrice}"
        id_tv_yuanjia?.getPaint()?.setFlags(Paint.STRIKE_THRU_TEXT_FLAG) //中划线
        id_tv_skill_price?.text = "${entity.skillPrice}"
        id_tv_lisheng?.text = "立省 ¥ ${entity.card?.costPrice}"
        id_img_icon?.setLoadImageUrl("${entity.card?.icon}", true)
    }

    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)
                }
            }
        }
        false
    }

    fun topay() {
        isClickPayBtn = true
        mLoading?.setLoading("请稍后...")
        mLoading?.show()
        mPayPresenter?.requestRightsAliPay(goodsID.toString(), pay_type.toString(), "","50",skill,outTradeNo)
    }

    override fun requestOrderSuc(result: AliPayEntity) {
        if (pay_type == RightsDetailActivity.MIN_PAY_PROGRAM) {
            SettingPreference.setOutTradeNo(result?.outTradeNo)
            JumpUtils.h5Jump("https://api.minpayment.com/pay.do?sendMsg=" + result.wakeup)
        } else if (pay_type == RightsDetailActivity.H5_PAY) {
            SettingPreference.setOutTradeNo(result?.outTradeNo)
            if (result.outTradeNo.isNullOrEmpty()) {
                EventUtils.onEvent("h5_pay_error")
                showResultLoading(false)
            } else {
                loadH5Pay(result.outTradeNo!!)
            }
        } else if (pay_type == RightsDetailActivity.ALI_PAY) {
            AlipayServer.payV2(this, result.wakeup!!)
        } else {
            showToast("暂不支持")
            EventUtils.onEvent("payment_error", "$pay_type")
        }
    }

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

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

    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 == PayActivity.MIN_PAY_PROGRAM || pay_type == PayActivity.H5_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!!)
    }
    private fun loadH5Pay(form: String) {
//        id_rights_pay_web_view.visibility = View.VISIBLE
        Log.d("wxw", "startTime" + System.currentTimeMillis())
        val webSettings = id_rights_pay_web_view.settings
        //如果访问的页面中要与Javascript交互，则webview必须设置支持Javascript
        webSettings.javaScriptEnabled = true
        //设置自适应屏幕，两者合用
        webSettings.useWideViewPort = true //将图片调整到适合webview的大小
        webSettings.loadWithOverviewMode = true // 缩放至屏幕的大小
        //其他细节操作
        webSettings.cacheMode = WebSettings.LOAD_NO_CACHE //关闭webview中缓存
        webSettings.allowFileAccess = true //设置可以访问文件
        webSettings.javaScriptCanOpenWindowsAutomatically = true //支持通过JS打开新窗口
        webSettings.loadsImagesAutomatically = true //支持自动加载图片
        webSettings.defaultTextEncodingName = "utf-8" //设置编码格式
        webSettings.domStorageEnabled = true
        webSettings.allowFileAccessFromFileURLs = true;
        webSettings.allowUniversalAccessFromFileURLs = true;

        id_rights_pay_web_view?.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                Log.e("WXW", "dURL" + url.toString())
                if (url == null) return false
                try {
                    if (url.startsWith("alipays://") //支付宝
                    ) {
                        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                        startActivity(intent)
                        EventUtils.onEvent("h5_open_zfb_suc")
                        return true
                    }
                } catch (e: Exception) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
                    EventUtils.onEvent("h5_open_zfb_error", e.toString())
                    showResultLoading(false)
                    return true //没有安装该app时，返回true，表示拦截自定义链接，但不跳转，避免弹出上面的错误页面
                }
                //处理http和https开头的url
                view?.loadUrl(url)
                return false
            }

            override fun onPageFinished(view: WebView?, url: String?) {
                Log.e("WXW", "cURL" + url.toString())
                Log.d("wxw", "EndTime" + System.currentTimeMillis())
                super.onPageFinished(view, url)
                if (url?.contains(NetConfig.H5.WEB_URL_H5_PAY) == true) {
                    id_rights_pay_web_view?.loadUrl("javascript:loadPayHtml('$form')");
                }
            }

            override fun onReceivedError(
                view: WebView?,
                request: WebResourceRequest?,
                error: WebResourceError?
            ) {
                super.onReceivedError(view, request, error)
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
//                    Log.d("wxw", "1error${error?.errorCode}")
//                    Log.d("wxw", "2error${error?.description}")
                    EventUtils.onEvent(
                        "h5_pay_error1",
                        "code: ${error?.errorCode} desc: ${error?.description}"
                    )
                } else {
                    EventUtils.onEvent("h5_pay_error1", error.toString())
                }
                showResultLoading(false)
            }

            override fun onReceivedHttpError(
                view: WebView?,
                request: WebResourceRequest?,
                errorResponse: WebResourceResponse?
            ) {
                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                    if (request?.url?.path?.endsWith("/favicon.ico") == true) {

                    } else {
                        EventUtils.onEvent(
                            "h5_pay_error2",
                            errorResponse?.statusCode.toString() + " url:${request?.url}"
                        )
                        showResultLoading(false)
                    }
                } else {
                    EventUtils.onEvent("h5_pay_error2", errorResponse.toString())
                    showResultLoading(false)
                }
                super.onReceivedHttpError(view, request, errorResponse)
            }
        }
        id_rights_pay_web_view.loadUrl(NetConfig.H5.WEB_URL_H5_PAY)

    }
    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
    }

}