package com.miya.fastcashier.viewmodel

import android.text.TextUtils
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.GsonUtils
import com.elvishew.xlog.XLog
import com.fastcashier.lib_common.function.account.AccountService
import com.fastcashier.lib_common.function.pay.PayRepository
import com.fastcashier.lib_common.function.print.PrintService
import com.miya.fastcashier.dao.ViewPayOrderData
import com.sdy.miya.moblie.component.pay.core.utils.PayLogFileUtils
import com.sdy.miya.moblie.component.pay.platform.bean.PayServiceResponse
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch


class PayViewModel : ViewModel() {

    lateinit var payResultJob: Job

    val refundLiveData: MutableLiveData<Result<PayServiceResponse>> = MutableLiveData()
    val payServiceResponseLiveData: MutableLiveData<Result<PayServiceResponse>> = MutableLiveData()
    val payResultLiveData: MutableLiveData<Result<PayServiceResponse>> = MutableLiveData()

    /**
     * 退款全额
     */
    fun refund(payServiceResponse: PayServiceResponse) {
        XLog.d("开始退款:${GsonUtils.toJson(payServiceResponse)}")
        viewModelScope.launch(Dispatchers.IO) {
            //退款
            var refundPayServiceResponse: PayServiceResponse? = null
            try {
                val refundParams = HashMap<String, String>()
                refundParams["oriOrderNo"] = payServiceResponse.shopTradeNo;
                val refundOrderNo =
                    AccountService.getAccountInfo()?.shopInfo?.saasid + System.currentTimeMillis()
                refundParams["refundOrderNo"] = refundOrderNo
                refundParams["refundPrice"] = payServiceResponse.tradPrice
                refundPayServiceResponse = PayRepository.refundByOrderNo(refundParams)
                XLog.d("退款成功:${GsonUtils.toJson(refundPayServiceResponse)}")
                //保存到数据库
                ViewPayOrderData.insert(refundPayServiceResponse)
                refundLiveData.postValue(Result.success(refundPayServiceResponse))

            } catch (e: Exception) {
                e.printStackTrace()
                XLog.d("退款异常:${e.message}")
                refundLiveData.postValue(Result.failure(e))
            }

            //退款打印
            try {
                XLog.d("开始退款打印")
                AccountService.getAccountInfo()
                    ?.let {
                        refundPayServiceResponse?.let { it1 ->
                            PrintService.refundPrint(
                                it,
                                it1
                            )
                        }
                    }
            } catch (e: Exception) {
                e.printStackTrace()
                refundLiveData.postValue(Result.failure(e))
                XLog.d("退款打印异常${e.message}")
            }

        }
    }

    /**
     * 退款固定数额
     */
    fun refund(payServiceResponse: PayServiceResponse, refundPrice: String) {
        XLog.d("退款:参数${GsonUtils.toJson(payServiceResponse)}")
        PayLogFileUtils.writeLog("退款:参数${GsonUtils.toJson(payServiceResponse)}")
        viewModelScope.launch(Dispatchers.IO) {
            //退款
            var refundPayServiceResponse: PayServiceResponse? = null
            try {
                val refundParams = HashMap<String, String>()
                refundParams["oriOrderNo"] = payServiceResponse.shopTradeNo;
                val refundOrderNo =
                    AccountService.getAccountInfo()?.shopInfo?.saasid + System.currentTimeMillis()
                refundParams["refundOrderNo"] = refundOrderNo
                refundParams["refundPrice"] = refundPrice
                refundPayServiceResponse = PayRepository.refundByOrderNo(refundParams)
                //保存到数据库
                ViewPayOrderData.insert(refundPayServiceResponse)
                refundLiveData.postValue(Result.success(refundPayServiceResponse))

                XLog.d("退款成功:${GsonUtils.toJson(refundPayServiceResponse)}")
                PayLogFileUtils.writeLog("退款成功:${GsonUtils.toJson(refundPayServiceResponse)}")
            } catch (e: Exception) {
                e.printStackTrace()
                refundLiveData.postValue(Result.failure(e))
                XLog.d("退款异常:${e.message}")
            }

            //退款打印
            try {
                XLog.d("退款打印")
                PayLogFileUtils.writeLog("退款打印")
                AccountService.getAccountInfo()
                    ?.let {
                        refundPayServiceResponse?.let { it1 ->
                            PrintService.refundPrint(
                                it,
                                it1
                            )
                        }
                    }
            } catch (e: Exception) {
                e.printStackTrace()
                refundLiveData.postValue(Result.failure(e))

                XLog.d("退款打印异常${e.message}")
                PayLogFileUtils.writeLog("退款打印异常${e.message}")
            }

        }
    }


    /**
     * 生成付款码支付
     * payType 只支持微信或者支付宝
     * 2是微信 1是支付宝
     * price 传进来要是分,整数
     */
    fun generatePayCode(price: String, payType: String) {
        XLog.d("主扫码:开始生成")
        if (TextUtils.isEmpty(price)) {
            payServiceResponseLiveData.value = Result.failure(RuntimeException("请输入金额!"))
            return
        }

        val priceFen: String
        try {
            priceFen = price.toDouble().times(100).toInt().toString()
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
            payServiceResponseLiveData.value = Result.failure(RuntimeException("金额有误!"))
            return
        }

        val sassid = AccountService.getAccountInfo()?.shopInfo?.saasid
        val orderNo = sassid + System.currentTimeMillis()

        XLog.d("主扫码:订单号${orderNo},类型${payType}")
        PayLogFileUtils.writeLog("主扫:主扫码订单号${orderNo},类型${payType}")
        viewModelScope.launch(Dispatchers.IO) {
            try {
                val payServiceResponse = PayRepository.generatePayCode(orderNo, priceFen, payType)
                payServiceResponseLiveData.postValue(Result.success(payServiceResponse))
                XLog.d("生成付款码成功${GsonUtils.toJson(payServiceResponse)}")
                PayLogFileUtils.writeLog("主扫:生成付款码成功${GsonUtils.toJson(payServiceResponse)}")
            } catch (e: Exception) {
                e.printStackTrace()
                payServiceResponseLiveData.postValue(Result.failure(e))
                XLog.d("生成付款码异常${e.message}")
            }
        }
    }


    /**
     * 订单查询
     */
    fun payResultQuery(payServiceResponse: PayServiceResponse) {
        PayLogFileUtils.writeLog("支付查询订单号:${payServiceResponse.shopTradeNo}")
        payResultJob = viewModelScope.launch(Dispatchers.IO) {
            while (isActive) {
                try {
                    XLog.d("支付查询订单号:${payServiceResponse.shopTradeNo}")
                    val payServiceResponseResult =
                        PayRepository.payResultQuery(payServiceResponse.shopTradeNo)
                    //加入数据库
                    ViewPayOrderData.insert(payServiceResponseResult)
                    payResultLiveData.postValue(Result.success(payServiceResponseResult))

                    XLog.d("支付查询结果:${GsonUtils.toJson(payServiceResponseResult)}")
                    PayLogFileUtils.writeLog("支付查询结果:${GsonUtils.toJson(payServiceResponseResult)}")
                    break
                } catch (e: Exception) {
                    XLog.d("支付查询异常:${e.message}")
                    e.printStackTrace()
                    payResultLiveData.postValue(Result.failure(e))
                    Thread.sleep(5000)
                }
            }
        }
    }


    /**
     * 订单查询,退款查询
     */
    fun payResultQuery(orderNo: String) {
        PayLogFileUtils.writeLog("退款查询:订单号${orderNo}")
        viewModelScope.launch(Dispatchers.IO) {
            try {
                XLog.d("开始退款支付查询:${orderNo}")
                val payServiceResponseResult = PayRepository.payResultQuery(orderNo)
                payResultLiveData.postValue(Result.success(payServiceResponseResult))

                XLog.d("退款查询成功:${GsonUtils.toJson(payServiceResponseResult)}")
                PayLogFileUtils.writeLog("退款查询成功:${GsonUtils.toJson(payServiceResponseResult)}")
            } catch (e: Exception) {
                e.printStackTrace()
                XLog.d("退款支付查询异常:${e.message}")
                payResultLiveData.postValue(Result.failure(e))
            }
        }
    }


    /**
     * 被扫支付,金额是元,首先要转成分
     */
    fun pay(price: String, payCode: String) {
        if (TextUtils.isEmpty(price)) {
            payResultLiveData.value = Result.failure(RuntimeException("请输入金额!"))
            return
        }

        if (TextUtils.isEmpty(payCode)) {
            payResultLiveData.value = Result.failure(RuntimeException("付款码为空!"))
            return
        }

        val priceFen: String
        try {
            priceFen = price.toDouble().times(100).toInt().toString()
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
            payResultLiveData.value = Result.failure(RuntimeException("金额有误!"))
            return
        }

        val sassid = AccountService.getAccountInfo()?.shopInfo?.saasid
        val orderNo = sassid + System.currentTimeMillis()

        XLog.d("被扫: 参数 orderNo = $orderNo price = $priceFen payCode = $payCode")
        PayLogFileUtils.writeLog("被扫:开始,参数orderNo = $orderNo price = $priceFen payCode = $payCode")
        viewModelScope.launch(Dispatchers.IO) {
            try {
                //0代表不分类别付款
                val payServiceResponse = PayRepository.pay(orderNo, priceFen, payCode, "0")
                //保存到数据库
                ViewPayOrderData.insert(payServiceResponse)
                payResultLiveData.postValue(Result.success(payServiceResponse))
                PayLogFileUtils.writeLog("被扫:支付成功${GsonUtils.toJson(payServiceResponse)}")
                XLog.d("被扫支付成功${GsonUtils.toJson(payServiceResponse)}")
            } catch (e: Exception) {
                e.printStackTrace()
                payResultLiveData.postValue(Result.failure(e))
                XLog.d("被扫支付异常${GsonUtils.toJson(e.message)}")
            }
        }

    }

}