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.UserBankCard;
import com.red.circle.wallet.inner.model.cmd.UserBankCardBackQryCmd;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 用户银行卡.
 *
 * @author pengshigang on 2022/12/2
 */
public interface UserBankCardService {

  /**
   * 每种类型的卡片只能创建一张.
   *
   * @param userId   用户id
   * @param cardType 卡片类型
   * @param cardNo   银行卡号
   * @return true存在， false 不存在.
   */
  Boolean exist(Long userId, String cardType, String cardNo);

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

  /**
   * 获取用户正在使用银行卡.
   */
  UserBankCard getUseByUserId(Long userId);

  /**
   * 添加.
   */
  void add(UserBankCard card);

  /**
   * 修改.
   */
  void update(UserBankCard card);

  /**
   * 根据用户id获得银行卡列表.
   *
   * @param userId 用户id
   */
  List<UserBankCard> listByUserId(Long userId);

  /**
   * 根据用户id获得银行卡列表-通过的.
   *
   * @param userId 用户id
   */
  List<UserBankCard> listPassByUserId(Long userId);

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

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

  /**
   * 银行卡列表分页.
   */
  PageResult<UserBankCard> pageQuery(UserBankCardBackQryCmd query);

  /**
   * 删除银行卡.
   *
   * @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 cardType 卡片类型.
   * @param cardNo   卡号.
   */
  UserBankCard getOne(Long userId, String cardType, String cardNo);

  /**
   * 移除用户相关银行卡.
   */
  void removeBatchByUserId(List<Long> teamIds);

  /**
   * 获取一组指定的兑换信息.
   */
  Map<Long, UserBankCard> mapByIds(Set<Long> ids);


}
