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.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.NumberUtils
import com.elvishew.xlog.XLog
import com.miya.fastcashier.beans.LoginRequest
import com.miya.fastcashier.beans.SelfCashierAccountInfo
import com.miya.fastcashier.beans.ViewPayOrderData
import com.miya.fastcashier.dao.DatabaseKeeper
import com.miya.fastcashier.repository.PayRepository
import com.miya.fastcashier.service.AccountService
import com.miya.fastcashier.service.LoginService
import com.miya.fastcashier.service.PrintService
import com.miya.fastcashier.utils.DateUtils
import com.sdy.miya.moblie.component.pay.core.error.ParamInvalidException
import com.sdy.miya.moblie.component.pay.platform.bean.MiyaOrderRefundResponse
import com.sdy.miya.moblie.component.pay.platform.bean.PayServiceResponse
import kotlinx.coroutines.*
import java.lang.RuntimeException
import java.util.*
import kotlin.collections.HashMap


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

    }

}