package svc

import (
	"applet/app/db"
	"applet/app/db/model"
	"applet/app/e"
	"applet/app/md"
	"applet/app/utils"
	"applet/app/utils/logx"
	"github.com/gin-gonic/gin"
	"time"
	"xorm.io/xorm"
)

func BalancePay(c *gin.Context, money, oid string, types string) error {

	user, err := CheckUser(c)
	if user == nil || err != nil {
		return err
	}
	// 获取余额更新锁
	cb, err := HandleBalanceDistributedLock(c.GetString("mid"), utils.IntToStr(user.Info.Uid), "balance_pay")
	if err != nil {
		return err
	}
	// 释放锁
	if cb != nil {
		defer cb()
	}
	finValid := utils.AnyToFloat64(user.Profile.FinValid)
	needMoney := utils.AnyToFloat64(money)
	if finValid < needMoney {
		return e.NewErrCode(e.ERR_BALANCE_NOT_ENOUGH)
	}
	user.Profile.FinValid = utils.AnyToString(finValid - needMoney)
	affect, err := db.UserProfileUpdate(db.DBs[c.GetString("mid")], user.Profile.Uid, user.Profile, "fin_valid")
	if err != nil || affect != 1 {
		return err
	}
	var str = ""
	if types == md.CommunityTeam {
		str = "小店下单"
	}
	flowInsert(db.DBs[c.GetString("mid")], user.Profile.Uid, money, 21, utils.StrToInt64(oid), 0, 0, str+"余额支付", types, 1, utils.Float64ToStr(finValid), user.Profile.FinValid)
	return nil
}
func flowInsert(eg *xorm.Engine, uid int, paidPrice string, orderAction int, ordId int64, id int64, goodsId int, ItemTitle string, ordType string, types int, beforeAmount string, afterAmount string) {
	session := eg.NewSession()

	now := time.Now()
	if err := db.FinUserFlowInsertOneWithSession(
		session,
		&model.FinUserFlow{
			Type:         types,
			Uid:          uid,
			Amount:       paidPrice,
			BeforeAmount: beforeAmount,
			AfterAmount:  afterAmount,
			OrdType:      ordType,
			OrdId:        utils.Int64ToStr(ordId),
			OrdAction:    orderAction,
			OrdDetail:    utils.IntToStr(goodsId),
			State:        2,
			OtherId:      id,
			OrdTitle:     ItemTitle,
			OrdTime:      int(now.Unix()),
			CreateAt:     now,
			UpdateAt:     now,
		}); err != nil {
		_ = session.Rollback()
		_ = logx.Warn(err)
		return
	}
}
