package com.yidianling.ydl_pay.pay

import android.app.Activity
import android.content.Context
import com.alipay.sdk.app.PayTask
import com.yidianling.ydl_pay.pay.bean.PayStatus
import com.tencent.mm.opensdk.constants.Build
import com.tencent.mm.opensdk.modelpay.PayReq
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import com.yidianling.ydl_pay.pay.bean.WXPayEvent
import com.ydl.ydlcommon.data.http.CustomThrowable
import com.yidianling.ydl_pay.common.bean.CommonWXPayBean
import com.yidianling.ydl_pay.common.bean.PayResult
import de.greenrobot.event.EventBus
import io.reactivex.Emitter
import io.reactivex.Observable
import io.reactivex.schedulers.Schedulers

/**
 * author : Zhangwenchao
 * e-mail : zhangwch@yidianling.com
 * time   : 2018/04/18
 */
object RxPay {

    init {
        EventBus.getDefault().register(this)
    }

    private var emitter: Emitter<PayStatus>? = null

    // 微信支付
    fun wxPay(context: Context, option: CommonWXPayBean.WXOption): Observable<PayStatus> {
        return Observable.create<PayStatus> { e ->
            val api = WXAPIFactory.createWXAPI(context, null)
            if (api.wxAppSupportAPI < Build.PAY_SUPPORTED_SDK_INT) {
                e.onError(CustomThrowable("目前您的微信版本过低或未安装微信，需要安装微信才能使用"))
                e.onComplete()
            }
            emitter = e

            api.registerApp(option.appid)
            val request = PayReq()
            request.appId = option.appid
            request.partnerId = option.partnerid
            request.prepayId = option.prepayid
            request.packageValue = "Sign=WXPay"
            request.nonceStr = option.noncestr
            request.timeStamp = option.timestamp
            request.sign = option.sign
            api.sendReq(request)
        }.subscribeOn(Schedulers.io())
    }

    // 支付宝支付
    fun aliPay(activity: Activity, aliSign: String): Observable<PayStatus> {
        return Observable.create<PayStatus> {
            val alipay = PayTask(activity)
            val result = alipay.payV2(aliSign, true)
            val payResult = PayResult(result)
            when {
                "9000" == payResult.resultStatus -> it.onNext(PayStatus(true))
                else -> it.onError(CustomThrowable(payResult.memo))
            }
            it.onComplete()
        }

    }

    fun onEvent(event: WXPayEvent) {
        if (event.status.success) {
            emitter?.onNext(event.status)
        } else {
            emitter?.onError(Throwable("支付失败", null))
        }
        emitter?.onComplete()
    }
}