
package com.tmerclub.cloud.user.service;

import com.tmerclub.cloud.api.payment.vo.ShopAccountDetailVO;
import com.tmerclub.cloud.api.user.bo.BalanceRefundBO;
import com.tmerclub.cloud.api.user.dto.FinanceDetailDTO;
import com.tmerclub.cloud.api.user.vo.FinanceDetailExcelVO;
import com.tmerclub.cloud.api.user.vo.FinanceDetailVO;
import com.tmerclub.cloud.api.user.vo.UserManagerVO;
import com.tmerclub.cloud.api.user.vo.UserPayInfoVO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.user.bo.mongo.MongoUserBalanceLogBO;
import com.tmerclub.cloud.user.vo.UserBalanceLogVO;

import java.util.Date;
import java.util.List;

/**
 * 余额记录
 *
 * @author tmerclub
 * @date 2021-04-27 15:51:36
 */
public interface UserBalanceLogService {

    /**
     * 保存到mongodb
     * @param mongoUserBalanceLogBO
     */
    void saveToMongdb(MongoUserBalanceLogBO mongoUserBalanceLogBO);

    /**
     * 批量保存到mongodb
     * @param list
     */
    void saveBatchToMongodb(List<MongoUserBalanceLogBO> list);

    /**
     * 根据余额记录id获取余额记录
     *
     * @param balanceLogId 余额记录id
     * @return 余额记录
     */
    MongoUserBalanceLogBO getByBalanceLogId(Long balanceLogId);

    /**
     * 分页查询某个用户的余额明细
     *
     * @param pageDTO
     * @param userId
     * @return
     */
    PageVO<UserBalanceLogVO> getPageByUserId(PageDTO pageDTO, Long userId);

    /**
     * 通过支付单号获取余额记录
     *
     * @param payId 支付单号
     * @return 余额记录
     */
    MongoUserBalanceLogBO getByPayId(Long payId);

    /**
     * 扣减余额，并将余额记录的支付状态变为已支付
     *
     * @param payId          支付单号
     * @param userBalanceLog 余额记录
     */
    void updateToOrderPaySuccess(Long payId, MongoUserBalanceLogBO userBalanceLog);

    /**
     * 更新为支付成功
     * @param balanceLogId
     * @param payId
     * @param payType
     */
    void updateToSuccess(Long balanceLogId, Long payId, Integer payType);

    /**
     * 执行退款
     *
     * @param balanceRefundBO 退款参数
     */
    void doRefund(BalanceRefundBO balanceRefundBO);

    /**
     * 分页获取用户余额充值财务详情
     *
     * @param pageDTO
     * @param financeDetailDTO
     * @return
     */
    PageVO<FinanceDetailVO> pageFinanceDetail(PageDTO pageDTO, FinanceDetailDTO financeDetailDTO);

    /**
     * 获取用户余额充值财务详情
     *
     * @param financeDetailDTO
     * @return
     */
    List<FinanceDetailExcelVO> listFinanceDetail(FinanceDetailDTO financeDetailDTO);

    /**
     * 获取平台财务信息
     *
     * @param startTime
     * @param endTime
     * @return
     */
    ShopAccountDetailVO getPlatformAccountDetail(Date startTime, Date endTime);

    /**
     * 获取用户充值，购买会员财务信息
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<UserPayInfoVO> listPayInfoVO(Date startTime, Date endTime);

    /**
     * 分页获取用户充值财务信息
     * @param startTime
     * @param endTime
     * @param pageDTO
     * @return
     */
    PageVO<UserPayInfoVO> pagePayInfoVO(Date startTime, Date endTime, PageDTO pageDTO);

    /**
     * 通过支付单号和类型获取余额记录
     *
     * @param payId        支付单号
     * @param rechargeType 类型
     * @return 余额记录
     */
    MongoUserBalanceLogBO getByPayIdAndType(Long payId, Integer rechargeType);

    /**
     * 初始化用户余额记录到mongodb
     */
    void initUserBalanceLogToMongodb();

    /**
     * 根据充值金额，获取用户id列表
     *
     * @param isPayed   是否支付
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param minAmount 最小金额
     * @param maxAmount 最大金额
     * @return 用户id列表
     */
    List<Long> listUserIdByRechargeAmount(Integer isPayed, Date startDate, Date endDate, Long minAmount, Long maxAmount);

    /**
     * 根据充值次数，获取用户id列表
     *
     * @param isPayed   是否支付
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @param minNum    最小次数
     * @param maxNum    最大次数
     * @return 用户id列表
     */
    List<Long> listUserIdByRechargeNum(Integer isPayed, Date startDate, Date endDate, Long minNum, Long maxNum);

    /**
     * 补充用户列表余额数据
     * @param userList
     * @return
     */
    List<UserManagerVO> setUserInfo(List<UserManagerVO> userList);
}
