package com.red.circle.wallet.infra.database.rds.service.freight;

import com.red.circle.common.business.core.enums.SysOriginPlatformEnum;
import com.red.circle.framework.dto.PageResult;
import com.red.circle.framework.mybatis.service.BaseService;
import com.red.circle.wallet.infra.database.rds.entity.freight.FreightBalance;
import com.red.circle.wallet.inner.model.cmd.UserFreightBalancePageQryCmd;
import com.red.circle.wallet.inner.model.cmd.UserFreightSellerCmd;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 用户货运账户 服务类.
 * </p>
 *
 * @author pengshigang
 * @since 2021-07-06
 */
public interface FreightBalanceService extends BaseService<FreightBalance> {

  /**
   * 货运账号是否被关闭.
   *
   * @param sysOrigin 平台
   * @param userId    用户id
   * @return true 是 false 否
   */
  boolean checkClose(SysOriginPlatformEnum sysOrigin, Long userId);

  /**
   * 是否存在货运账户.
   *
   * @param userId 用户id
   * @return true 存在，false 不存在
   */
  boolean existsBalance(Long userId);

  /**
   * 累计余额.
   *
   * @param sysOrigin 系统
   * @param userId    用户id
   * @param quantity  数量
   * @return 是否操作成功
   */
  boolean incrCandyBalance(SysOriginPlatformEnum sysOrigin, Long userId, BigDecimal quantity);

  /**
   * 类型消费累计.
   *
   * @param sysOrigin 系统
   * @param userId    用户id
   * @param quantity  数量
   * @return 是否操作成功
   */
  boolean decrCandyBalance(SysOriginPlatformEnum sysOrigin, Long userId, BigDecimal quantity);

  /**
   * 获取糖果余额.
   *
   * @param userId 用户id
   * @return 余额
   */
  BigDecimal getAvailableBalance(Long userId);

  /**
   * 获取平台货运代理人列表.
   *
   * @param sysOrigin 系统平台
   * @return list
   */
  Set<Long> listUserIdBySysOrigin(SysOriginPlatformEnum sysOrigin);

  /**
   * 获得余额大于1k的货运代理账户.
   *
   * @param sysOrigin 系统
   * @return list
   */
  List<FreightBalance> listFreightByBalanceGt1K(SysOriginPlatformEnum sysOrigin);

  /**
   * 获得货运代理总充值金币.
   */
  BigDecimal getEarnPoints(Long userId);

  /**
   * 是否为经销商.
   */
  boolean checkDealer(SysOriginPlatformEnum sysOrigin, Long userId);

  /**
   * 是否为经销商根据id.
   */
  boolean checkDealerById(Long id);

  /**
   * 获取经销商卖家数量
   */
  Integer selectSellerQuantity(Long freightId, String sysOrigin);

  /**
   * 是否为货运代理角色
   *
   * @param userId 用户id
   * @return true是
   */
  Boolean checkFreightAgent(Long userId);

  /**
   * 是否为超级货运代理角色
   */
  Boolean checkSuperFreightAgent(Long userId);

  /**
   * 根据用户id获取货运代理
   */
  FreightBalance getFreightBalance(Long userId);

  /**
   * 根据id获取货运代理
   */
  FreightBalance getFreightBalanceById(Long id);

  PageResult<FreightBalance> pageFreight(UserFreightBalancePageQryCmd query);

  void updateSellerQuantity(UserFreightSellerCmd param);

  void deleteFreightBalance(Long userId);
}
