package report

import (
	"duoduo/models/shanghu"
	"fmt"
	"github.com/shopspring/decimal"
	"time"
)

// C端分账
// 分账逻辑:
// 1.获取待分账、分账失败的数据
// 2.根据商户卡id 将 90%分给商家,剩下的 10% 分给用户
// 3.一条一条的处理,防止处理数据太多导致重复重复分账 查到数据里面修改成分账中

func ClientAccount() {
	//
	for true {
		//查询订单信息
		var account shanghu.ClientPayTrans
		var saleOpenid string     //分销人员id
		account.AccountStatus = 1 //未分账
		account.Status = 2        //支付成功
		clientTrans, err := account.GetPayTransByStatus()
		if err != nil {
			fmt.Println("GetPayTransByStatus err ", err.Error())
			break
		}
		data := make(map[string]interface{})
		data["account_status"] = 3 //分账中
		data["updated_at"] = time.Now()
		err = clientTrans.UpdateById(data)
		if err != nil {
			fmt.Println("UpdateById err ", err.Error())
			break
		}

		//查询卡信息
		var cardInfo shanghu.MerchantCard
		cardInfo.ID = clientTrans.MerchantCardID
		merchantCard, err := cardInfo.GetMerchantCard()
		if err != nil {
			dataErr := make(map[string]interface{})
			dataErr["account_status"] = 2            //分账失败
			dataErr["account_err_log"] = err.Error() //分账失败日志
			dataErr["updated_at"] = time.Now()
			err = clientTrans.UpdateById(dataErr)
			if err != nil {
				fmt.Println("GetMerchantCard err ", err.Error())
				break
			}
			continue
		}
		//分账
		//按比例商户一部分,分销一部分
		//计算金额
		fmt.Println(merchantCard.RebateRate)
		fmt.Println(clientTrans.Amount)
		var clientAmount decimal.Decimal
		if clientTrans.InvitationCode == "yuanshima" {
			clientAmount = decimal.NewFromInt(0)
			saleOpenid = ""
		} else {
			clientAmount = clientTrans.Amount.Mul(decimal.NewFromInt(merchantCard.RebateRate)).Div(decimal.NewFromInt(100)).Round(2)
			var accountByCode shanghu.MerchantClientUser
			accountByCode.Code = clientTrans.InvitationCode
			codeInfo, err := accountByCode.GetUserInfoByCode()
			if err != nil {
				dataErr := make(map[string]interface{})
				dataErr["account_status"] = 2            //分账失败
				dataErr["account_err_log"] = err.Error() //分账失败日志
				dataErr["updated_at"] = time.Now()
				err = clientTrans.UpdateById(dataErr)
			}
			saleOpenid = codeInfo.ClientOpenID
		}
		fmt.Println(clientAmount)
		merchantAmount := clientTrans.Amount.Sub(clientAmount).Round(2)
		fmt.Println(merchantAmount)

		//乐观锁
		err = account.SettleAdd(merchantAmount, clientAmount, merchantCard.MerchantOpenID, saleOpenid, clientTrans.ID)
		if err != nil {
			dataErr := make(map[string]interface{})
			dataErr["account_status"] = 2            //分账失败
			dataErr["account_err_log"] = err.Error() //分账失败日志
			dataErr["updated_at"] = time.Now()
			err = clientTrans.UpdateById(dataErr)
			if err != nil {
				break
			}
			continue
		}

		dataSuccess := make(map[string]interface{})
		dataSuccess["account_status"] = 99 //
		dataSuccess["updated_at"] = time.Now()
		err = clientTrans.UpdateById(dataSuccess)
		if err != nil {
			dataErr := make(map[string]interface{})
			dataErr["account_err_log"] = "99 error" //分账失败日志
			dataErr["updated_at"] = time.Now()
			err = clientTrans.UpdateById(dataErr)
			if err != nil {
				fmt.Println("GetMerchantCard err ", err.Error())
				break
			}
			fmt.Println("UpdateById err ", err.Error())
			break
		}

	}

}