package com.hzs.bonus.bonus.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.core.web.page.TableDataInfo;
import com.hzs.common.domain.member.bonus.CuMemberBonus;
import com.hzs.common.domain.member.ext.CuMemberBonusExt;
import com.hzs.bonus.bonus.param.BonusParam;
import com.hzs.bonus.bonus.vo.MemberBonusVO;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 会员奖金-会员奖金汇总表 服务类
 */
public interface ICuMemberBonusService extends IService<CuMemberBonus> {

    /**
     * 批量获取cuMemberBonus主键
     *
     * @param rowNum 数量
     */
    List<Long> batchQueryCuMemberBonusSeq(Integer rowNum);

    /**
     * 根据查询条件查询每日奖金汇总
     *
     * @param bonusParam 查询条件
     */
    List<MemberBonusVO> queryMemberBonusTotalVoByCondition(BonusParam bonusParam);

    /**
     * 根据查询条件查询会员奖金
     *
     * @param bonusParam 查询条件
     */
    List<CuMemberBonusExt> queryMemberBonusVoByCondition(BonusParam bonusParam);

    /**
     * 根据查询条件查询会员秒接奖金
     *
     * @param bonusParam 查询条件
     */
    List<CuMemberBonusExt> queryMemberSecondBonusVoByCondition(BonusParam bonusParam);

    /**
     * 根据查询条件查询会员奖金
     *
     * @param bonusParam 查询条件
     */
    List<CuMemberBonusExt> queryMemberBonusTotalByCondition(BonusParam bonusParam);

    /**
     * 根据查询条件查询会员奖金
     *
     * @param bonusParam 查询条件
     */
    List<CuMemberBonusExt> queryMemberBonusVoByConditionForServer(BonusParam bonusParam);

    /**
     * 根据条件查询查询每天奖金汇总
     *
     * @param bonusParam 查询条件
     */
    List<CuMemberBonusExt> queryBonusTotalVoByConditionForServer(BonusParam bonusParam);

    /**
     * 根据查询条件查询会员明细奖金
     *
     * @param bonusParam 查询条件
     */
    TableDataInfo queryMemberBonusDetailVoByCondition(BonusParam bonusParam);

    /**
     * 后台根据查询条件查询会员奖金明细
     *
     * @param bonusParam 查询条件
     */
    TableDataInfo queryMemberBonusDetailSerVoByCondition(BonusParam bonusParam);

    /**
     * 删除会员奖金汇总表
     *
     * @param period 结算期间
     */
    void deleteCuMemberBonus(Integer period);

    /**
     * 批量插入会员奖金主表
     *
     * @param cuMemberBonusList 会员奖金
     */
    void batchInsertCuMemberBonus(List<CuMemberBonus> cuMemberBonusList);

    /**
     * 批量插入会员奖金主表
     *
     * @param cuMemberBonusList 会员奖金
     */
    void insertOrUpdateCuMemberBonus(List<CuMemberBonus> cuMemberBonusList);

    /*
     *  查询会员奖金
     **/
    List<CuMemberBonus> queryCuMemberBonus(int period, List<CuMemberBonus> cuMemberBonusList);

    /**
     * 根据国家、期间查询存在首购奖金的会员
     *
     * @param period        期间
     * @param pkCountryList 国家
     */
    List<CuMemberBonus> queryExistsPurchaseBonusMember(Integer period, List<Integer> pkCountryList);

    /**
     * 更新奖金状态
     *
     * @param grantStatus    发放状态
     * @param oldGrantStatus 原来的发放状态
     * @param startPeriod    期间
     */
    Boolean updateCuMemberBonusStatus(Integer pkCountry, Integer grantStatus, Integer oldGrantStatus, Integer startPeriod, Integer endPeriod);

    /**
     * 根据发放状态查询某一期的奖金
     *
     * @param grantStatus 发放状态
     * @param startPeriod 期间
     * @param endPeriod   期间
     */
    List<CuMemberBonus> queryCuMemberBonusByCondition(Integer pkCountry, Integer grantStatus, Integer startPeriod, Integer endPeriod);

    /*
     *  定时任务每天自动计算奖金
     **/
    Boolean autoCalculateBonus(Date startDate, Date endDate);

    /*
     *  查询会员奖金根据期间
     **/
    Set<Long> queryMemberBonusByPeriod(Integer period);

    void calculateBonusTotal(CuMemberBonusExt cuMemberBonusExt, CuMemberBonusExt memberBonusExt);

    CuMemberBonusExt initCuMemberBonus();

    /*
     *  查询会员一周周期的拓展累计，复购拓展累计
     **/
    Map<Long, CuMemberBonus> queryWeekMemberBonus(int startPeriod, int endPeriod);
}
