package models

import (
	"boss/internal/common"
	"boss/internal/models/accounts"
	"context"
	"errors"
	"github.com/beego/beego/v2/client/orm"
	"github.com/beego/beego/v2/core/logs"
	"time"
)

func OperatorAccount(accountUid, operatorType string, amount float64) (string, bool) {
	o := orm.NewOrm()

	msg := ""
	if err := o.DoTx(func(ctx context.Context, txOrm orm.TxOrmer) error {

		//处理事务
		accountInfo := new(accounts.AccountInfo)
		if err := txOrm.Raw("select * from account_info where account_uid = ? for update", accountUid).
			QueryRow(accountInfo); err != nil || accountInfo.AccountUid == "" {
			logs.Error("operator account get account info for update fail: ", err)
			return err
		}

		accountInfo.UpdateTime = time.Now()
		flag := true

		switch operatorType {
		case common.PLUS_AMOUNT: //处理加款操作
			accountInfo.Balance = accountInfo.Balance + amount
			accountInfo.SettleAmount = accountInfo.SettleAmount + amount
		case common.SUB_AMOUNT: //处理减款
			if accountInfo.Balance >= amount && accountInfo.SettleAmount >= amount {
				accountInfo.Balance = accountInfo.Balance - amount
				accountInfo.SettleAmount = accountInfo.SettleAmount - amount
			} else {
				msg = "账户余额不够减"
				flag = false
			}
		case common.FREEZE_AMOUNT: //处理冻结款
			accountInfo.FreezeAmount = accountInfo.FreezeAmount + amount
		case common.UNFREEZE_AMOUNT: //处理解冻款
			if accountInfo.FreezeAmount >= amount {
				accountInfo.FreezeAmount = accountInfo.FreezeAmount - amount
			} else {
				msg = "账户冻结金额不够解冻款"
				flag = false
			}
		}
		if !flag {
			return errors.New("处理失败")
		}

		if _, err := txOrm.Update(accountInfo); err != nil {
			logs.Error("operator account update account fail: ", err)
			return err
		}
		//往account_history表中插入一条动账记录
		accountHistory := accounts.AccountHistoryInfo{AccountUid: accountUid, AccountName: accountInfo.AccountName, Type: operatorType,
			Amount: amount, Balance: accountInfo.Balance, CreateTime: time.Now(), UpdateTime: time.Now()}

		if _, err := txOrm.Insert(&accountHistory); err != nil {
			logs.Error("operator account insert account history fail: ", err)
			return err
		}

		return nil
	}); err != nil {
		return msg, false
	}

	return msg, true
}
