package com.seer.teach.pay.service;

import com.seer.teach.pay.entity.PayMerchantAccountEntity;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;
import java.util.Map;

/**
 * <p>
 * 用户可提现余额表 服务类
 * </p>
 *
 * @author ZS
 * @since 2025-09-22
 */
public interface IPayMerchantAccountService extends IService<PayMerchantAccountEntity> {

    /**
     * 获取用户可提现余额
     *
     * @param userId 用户ID
     * @return 可提现余额
     */
    PayMerchantAccountEntity getMyAccount(Long userId);

    /**
     * 初始化用户可提现余额
     *
     * @param userId 用户ID
     * @return 可提现余额
     */
    PayMerchantAccountEntity initUserWithdrawalBalance(Long userId);

    /**
     * 解冻资金到可用余额
     *
     * @param userId 用户ID
     * @param amount 增加的金额
     * @return true：成功，false：失败
     */
    boolean releaseFrozenToAvailable(Long userId, BigDecimal amount);

    /**
     * 扣减账户余额
     *
     * @param userId 用户ID
     * @param amount 扣减的金额
     * @return true：成功，false：失败
     */
    boolean decreaseBalance(Long userId, BigDecimal amount);

    /**
     * 增加账户余额
     *
     * @param userId 用户ID
     * @param amount 增加的金额
     * @return true：成功，false：失败
     */
    boolean increaseBalance(Long userId, BigDecimal amount);

    /**
     * 批量增加商户冻结资金（同时更新冻结余额和总金额）
     *
     * @param merchantAmountMap 商户ID和增加金额的映射
     * @return true：全部成功，false：至少有一个失败
     */
    boolean batchIncreaseMerchantFrozenFunds(Map<Long, BigDecimal> merchantAmountMap);
    
    /**
     * 批量扣减账户冻结余额（同时减少冻结金额和总金额）
     *
     * @param merchantAmountMap 商户ID和扣减金额的映射
     * @return true：全部成功，false：至少有一个失败
     */
    boolean batchDecreaseFrozenBalance(Map<Long, BigDecimal> merchantAmountMap);
    
    /**
     * 商户提现申请时冻结资金（减少可用余额，增加冻结余额）
     *
     * @param userId 用户ID
     * @param amount 冻结金额
     * @return true：成功，false：失败
     */
    boolean freezeBalanceForWithdrawal(Long userId, BigDecimal amount);
    
    /**
     * 提现审核拒绝时解冻资金（增加可用余额，减少冻结余额）
     *
     * @param userId 用户ID
     * @param amount 解冻金额
     * @return true：成功，false：失败
     */
    boolean unfreezeBalanceForWithdrawalReject(Long userId, BigDecimal amount);
    
}