package com.miya.fastcashier.viewmodel

import android.text.TextUtils
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.alibaba.fastjson.JSON
import com.elvishew.xlog.XLog
import com.miya.fastcashier.beans.ViewPayOrderData
import com.miya.fastcashier.repository.PayRepository
import com.miya.fastcashier.service.AccountService
import com.miya.fastcashier.service.PrintService
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("开始退款：${JSON.toJSONString(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("退款成功：${JSON.toJSONString(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()
                XLog.d("退款打印异常${e.message}")
                refundLiveData.postValue(Result.failure(e))
            }

        }
    }

    /**
     * 退款固定数额
     */
    fun refund(payServiceResponse: PayServiceResponse, refundPrice: String) {
        XLog.d("开始退款：${JSON.toJSONString(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)
                XLog.d("退款成功：${JSON.toJSONString(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()
                XLog.d("退款打印异常${e.message}")
                refundLiveData.postValue(Result.failure(e))
            }

        }
    }


    /**
     * 生成付款码支付
     * 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}")
        viewModelScope.launch(Dispatchers.IO) {
            try {
                val payServiceResponse = PayRepository.generatePayCode(orderNo, priceFen, payType)
                payServiceResponseLiveData.postValue(Result.success(payServiceResponse))
                XLog.d("生成付款码成功${JSON.toJSONString(payServiceResponse)}")
            } catch (e: Exception) {
                e.printStackTrace()
                XLog.d("生成付款码异常${e.message}")
                payServiceResponseLiveData.postValue(Result.failure(e))
            }
        }
    }


    /**
     * 订单查询
     */
    fun payResultQuery(payServiceResponse: PayServiceResponse) {
        payResultJob = viewModelScope.launch(Dispatchers.IO) {
            while (isActive) {
                try {
                    XLog.d("支付查询订单号：${payServiceResponse.shopTradeNo}")
                    val payServiceResponseResult =
                        PayRepository.payResultQuery(payServiceResponse.shopTradeNo)
                    XLog.d("支付查询结果：${JSON.toJSONString(payServiceResponseResult)}")
                    //加入数据库
                    ViewPayOrderData.insert(payServiceResponseResult)
                    payResultLiveData.postValue(Result.success(payServiceResponseResult))
                    break
                } catch (e: Exception) {
                    XLog.d("支付查询异常：${e.message}")
                    e.printStackTrace()
                    payResultLiveData.postValue(Result.failure(e))
                    Thread.sleep(5000)
                }
            }
        }
    }


    /**
     * 订单查询，退款查询
     */
    fun payResultQuery(orderNo: String) {
        viewModelScope.launch(Dispatchers.IO) {
            try {
                XLog.d("开始退款支付查询：${orderNo}")
                val payServiceResponseResult = PayRepository.payResultQuery(orderNo)
                XLog.d("退款支付查询成功：${JSON.toJSONString(payServiceResponseResult)}")
                payResultLiveData.postValue(Result.success(payServiceResponseResult))
            } catch (e: Exception) {
                e.printStackTrace()
                XLog.d("退款支付查询异常：${e.message}")
                payResultLiveData.postValue(Result.failure(e))
            }
        }
    }


    /**
     * 被扫支付，金额是元，首先要转成分
     */
    fun pay(price: String, payCode: String) {
        XLog.d("被扫开始")
        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")
        viewModelScope.launch(Dispatchers.IO) {
            try {
                //0代表不分类别付款
                val payServiceResponse = PayRepository.pay(orderNo, priceFen, payCode, "0")
                //保存到数据库
                ViewPayOrderData.insert(payServiceResponse)
                payResultLiveData.postValue(Result.success(payServiceResponse))
                XLog.d("被扫支付成功${JSON.toJSONString(payServiceResponse)}")
            } catch (e: Exception) {
                e.printStackTrace()
                payResultLiveData.postValue(Result.failure(e))
                XLog.d("被扫支付异常${JSON.toJSONString(e.message)}")
            }
        }

    }

}