package admin_agent

import (
	"context"
	"errors"
	"fmt"

	"tydata-server/app/main/api/internal/svc"
	"tydata-server/app/main/api/internal/types"
	"tydata-server/app/main/model"
	"tydata-server/common/xerr"

	"github.com/zeromicro/go-zero/core/logx"
	"github.com/zeromicro/go-zero/core/stores/sqlx"
)

type AdminUpdateAgentWalletBalanceLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewAdminUpdateAgentWalletBalanceLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpdateAgentWalletBalanceLogic {
	return &AdminUpdateAgentWalletBalanceLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *AdminUpdateAgentWalletBalanceLogic) AdminUpdateAgentWalletBalance(req *types.AdminUpdateAgentWalletBalanceReq) (resp *types.AdminUpdateAgentWalletBalanceResp, err error) {
	// 参数校验
	if req.AgentId <= 0 {
		return nil, xerr.NewErrMsg("代理ID无效")
	}
	if req.Amount == 0 {
		return nil, xerr.NewErrMsg("修改金额不能为0")
	}

	// 查询代理钱包信息
	wallet, err := l.svcCtx.AgentWalletModel.FindOneByAgentId(l.ctx, req.AgentId)
	if err != nil {
		if errors.Is(err, model.ErrNotFound) {
			return nil, xerr.NewErrMsg("代理钱包不存在")
		}
		return nil, err
	}

	// 计算新余额
	newBalance := wallet.Balance + req.Amount

	// 校验余额不能为负数
	if newBalance < 0 {
		return nil, xerr.NewErrMsg(fmt.Sprintf("操作后余额不能为负数，当前余额: %.2f，操作金额: %.2f", wallet.Balance, req.Amount))
	}

	// 更新余额
	updateErr := l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error {
		// 记录变动前的余额
		balanceBefore := wallet.Balance
		frozenBalanceBefore := wallet.FrozenBalance

		// 使用版本号更新
		wallet.Balance = newBalance
		err := l.svcCtx.AgentWalletModel.UpdateWithVersion(transCtx, session, wallet)
		if err != nil {
			return err
		}

		// 创建钱包交易流水记录（手动调整）
		remark := fmt.Sprintf("管理员手动调整余额，金额: %.2f", req.Amount)
		transErr := l.svcCtx.AgentService.CreateWalletTransaction(
			transCtx,
			session,
			req.AgentId,
			model.WalletTransactionTypeAdjust,
			req.Amount,           // 变动金额（正数表示增加，负数表示减少）
			balanceBefore,        // 变动前余额
			wallet.Balance,       // 变动后余额
			frozenBalanceBefore,  // 变动前冻结余额
			wallet.FrozenBalance, // 变动后冻结余额（保持不变）
			"",                   // 关联交易ID（无关联）
			0,                    // 关联用户ID（无关联）
			remark,               // 备注
		)
		if transErr != nil {
			l.Logger.Errorf("创建代理钱包流水记录失败: %+v", transErr)
			return transErr
		}

		l.Logger.Infof("代理钱包余额变更 - AgentId: %d, 原余额: %.2f, 变更金额: %.2f, 新余额: %.2f",
			req.AgentId, balanceBefore, req.Amount, wallet.Balance)

		return nil
	})

	if updateErr != nil {
		l.Logger.Errorf("更新代理钱包余额失败: %+v", updateErr)
		return nil, xerr.NewErrMsg("更新余额失败")
	}

	resp = &types.AdminUpdateAgentWalletBalanceResp{
		Success: true,
		Balance: newBalance,
	}
	return
}
