package com.red.circle.wallet.infra.database.mongo.service.bank;

import com.red.circle.framework.dto.PageResult;
import com.red.circle.wallet.infra.database.mongo.entity.bank.UserWithdrawInfo;
import com.red.circle.wallet.inner.model.cmd.UserWithdrawInfoBackQryCmd;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户提现信息.
 *
 * @author tf
 */
public interface UserWithdrawInfoService {

  /**
   * 检查提现信息是否存在.
   *
   * @param userId   用户id
   * @param category 类别
   * @return true存在， false 不存在.
   */
  Boolean exist(Long userId, String category);

  /**
   * 根据id查询对象.
   */
  UserWithdrawInfo getById(Long id);

  /**
   * 获取用户正在使用的提现信息.
   */
  UserWithdrawInfo getUseByUserId(Long userId);

  /**
   * 添加.
   */
  void add(UserWithdrawInfo info);

  /**
   * 修改.
   */
  void update(UserWithdrawInfo info);

  /**
   * 根据用户id获得提现信息列表.
   *
   * @param userId 用户id
   */
  List<UserWithdrawInfo> listByUserId(Long userId);

  /**
   * 根据用户id获得提现信息列表-通过审核的.
   *
   * @param userId 用户id
   */
  List<UserWithdrawInfo> listPassByUserId(Long userId);

  /**
   * 删除提现信息.
   *
   * @param id id.
   */
  void deleteByIdByUserId(Long id, Long userId, Long currentUidLong);

  /**
   * 将提现信息设置为使用状态.
   *
   * @param id id.
   */
  void use(Long id, Long userId, Long currentUidLong);

  /**
   * 根据条件查询提现信息.
   *
   * @param userId   用户ID.
   * @param category 类别.
   */
  UserWithdrawInfo getOne(Long userId, String category);

  /**
   * 移除用户相关提现信息.
   */
  void removeBatchByUserId(List<Long> userIds);

  /**
   * 通过审核.
   *
   * @param ids ids.
   */
  void pass(Set<Long> ids, Long currentUidLong);

  /**
   * 驳回.
   *
   * @param ids ids.
   */
  void notPass(Set<Long> ids, Long currentUidLong);

  /**
   * 提现信息列表分页.
   */
  PageResult<UserWithdrawInfo> pageQuery(UserWithdrawInfoBackQryCmd query);

  /**
   * 获取一组指定的提现信息.
   */
  Map<Long, UserWithdrawInfo> mapByIds(Set<Long> ids);

}
