package com.seer.teach.pay.service;

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

import java.math.BigDecimal;

/**
 * <p>
 *  用户学豆账户服务类
 * </p>
 *
 * @author Captain
 * @since 2025-06-18
 */
public interface IPayCoinAccountService extends IService<PayCoinAccountEntity> {

    /**
     * 根据用户ID获取学豆账户
     *
     * @param userId 用户ID
     * @return 用户的学豆账户实体，如果找不到则返回null
     */
    PayCoinAccountEntity getByUserId(Integer userId);

    /**
     * 根据用户ID和账户ID获取学豆账户
     *
     * @param userId  用户ID
     * @param accountId 账户ID
     * @return 用户的学豆账户实体，如果找不到则返回null
     */
    PayCoinAccountEntity getByUserIdAndAccountId(Integer userId, Integer accountId);

    /**
     * 创建用户学豆账户
     *
     * @param userId 用户ID
     * @return 如果账户成功创建则返回账号
     */
    PayCoinAccountEntity createAccount(Integer userId);

    /**
     * 增加账户余额（加法）
     *
     * @param userId  用户ID
     * @param accountId 账户ID
     * @param amount   增加的金额
     * @return 如果余额更新成功则返回true，否则返回false
     */
    boolean addBalance(Integer userId,Integer accountId, BigDecimal amount);

    /**
     * 扣减账户余额（减法）
     *
     * @param userId    用户ID
     * @param accountId 账户ID
     * @param amount     扣减的金额（必须大于0）
     * @return 如果余额扣减成功则返回true，否则返回false
     */
    boolean deductBalance(Integer userId, Integer accountId, BigDecimal amount);

    /**
     * 扣减账户余额（减法）
     *
     * @param userId    用户ID
     * @param amount     扣减的金额（必须大于0）
     * @return 如果余额扣减成功则返回true，否则返回false
     */
    boolean deductBalance(Integer userId, BigDecimal amount);

    /**
     * 冻结金额
     *
     * @param userId  用户ID
     * @param accountId 账户ID
     * @param amount   需要冻结的金额
     * @return 如果金额冻结成功则返回true，否则返回false
     */
    boolean freezeBalance(Integer userId,Integer accountId, BigDecimal amount);

    /**
     * 解冻金额
     *
     * @param userId  用户ID
     * @param accountId 账户ID
     * @param amount   需要解冻的金额
     * @return 如果金额解冻成功则返回true，否则返回false
     */
    boolean unfreezeBalance(Integer userId,Integer accountId, BigDecimal amount);

    /**
     * 充值账户
     *
     * @param userId    用户ID
     * @param amount    充值金额（单位：分）
     * @return 是否充值成功
     */
    boolean recharge(Integer userId, BigDecimal amount);
}
