package com.hzs.bonus.detail.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.hzs.common.domain.member.achieve.ext.CuMemberRetailRangeExt;
import com.hzs.common.domain.member.detail.CuMemberAwards;
import com.hzs.common.domain.system.config.BdAwards;

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

/**
 * 会员信息-奖衔升级记录 服务类
 */
public interface ICuMemberAwardsService extends IService<CuMemberAwards> {

    /**
     * 重新计算会员的奖衔，根据累计结束后的业绩
     *
     * @param settleDate       结算日
     * @param countryAwardsMap 国家奖衔配置
     * @param settleTableName  结算表
     */
    void calculateCuMemberAwards(String settleDate, Map<String, BdAwards> countryAwardsMap, String settleTableName);

    /**
     * 回退极差奖衔，每日重新结算，先把奖衔回退到前一天
     *
     * @param period         结算期间
     * @param rangeTableName 结算表
     */
    void calculateCuMemberRangeAwardsInit(Integer period, String rangeTableName, Integer systemType);

    /**
     * 回退极差奖衔，每日重新结算，先把奖衔回退到前一天
     *
     * @param period         结算期间
     * @param rangeTableName 结算表
     */
    void calculateCuMemberRetailRangeAwardsInit(String settleDate, Integer period, String rangeTableName);

    /**
     * 批量插入奖衔记录
     *
     * @param cuMemberAwardsList 需要插入的奖衔列表
     */
    void saveBatchCuMemberAwards(List<CuMemberAwards> cuMemberAwardsList);

    /*
     *  删除升级的奖衔
     **/
    void deleteCuMemberAwards(List<CuMemberAwards> cuMemberAwards, Integer period);

    /*
     *  查询自动升级的等级
     **/
    List<CuMemberAwards> queryCuMemberAwards(List<CuMemberRetailRangeExt> cuMemberRetailRangeExtList, Integer period);

    /*
     *  回退等级
     **/
    void mergeCuMemberBackAwards(String rangeTableName, Long pkMember, Integer period);

    /**
     * 删除奖衔升级记录
     *
     * @param pkOrder         订单
     * @param pkApprove       审核人
     * @param currentDateTime 当前时间
     */
    void deleteCuMemberAwards(Long pkOrder, Long pkApprove, Date currentDateTime);

    /*
     *  每月1号计算奖衔
     **/
    void calculateCuMemberAwardsEveryMonth(Integer currentMonthFirstPeriod, Integer yesterdayPeriod, Integer period, String settleDate, String beforeMontTableName, Map<String, BdAwards> awardsMap);

    /*
     *  根据结算表更新奖衔
     **/
    void updateCuMemberAwardsExamine(Date currentDate, Integer period);
}
