package com.ym.mec.biz.dal.dao;

import com.ym.mec.biz.dal.dto.CalenderPushDto;
import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto;
import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender;
import com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender.PayUserType;
import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
import com.ym.mec.common.dal.BaseDAO;
import org.apache.ibatis.annotations.Param;

import java.util.*;

public interface MusicGroupPaymentCalenderDao extends BaseDAO<Long, MusicGroupPaymentCalender> {

    /**
     * 根据乐团编号删除乐团缴费周期
     *
     * @param musicGroupId
     */
    void delByGroupId(String musicGroupId);

    /**
     * 根据乐团编号获取乐团缴费日历
     *
     * @param musicGroupId
     * @return
     */
    List<MusicGroupPaymentCalender> findByMusicGroupId(String musicGroupId);

    /**
     * 批量修改
     *
     * @param musicGroupPaymentCalenderList
     * @return
     */
    int batchUpdate(List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList);


    /**
     * 批量插入
     *
     * @param musicGroupPaymentCalenderList
     * @return
     */
    int batchInsert(List<MusicGroupPaymentCalender> musicGroupPaymentCalenderList);

    /**
     * 查询指定状态的记录
     *
     * @param status
     * @return
     */
    List<MusicGroupPaymentCalender> queryByPaymentStatus(@Param("status") List<MusicGroupPaymentCalender.PaymentCalenderStatusEnum> status, @Param("payUserType") String payUserType);

    /**
     * 获取缴费信息锁
     *
     * @param id
     * @return
     */
    MusicGroupPaymentCalender getForLock(@Param("id") Long id);

    /**
     * 根据指定乐团的缴费日期查询交集
     *
     * @param musicGroupId        乐团编号
     * @param startPaymentDate    开始缴费日期
     * @param deadlinePaymentDate 截止缴费日期
     * @return
     */
    int queryIntersectionByPaymentDate(@Param("musicGroupId") String musicGroupId, @Param("startPaymentDate") Date startPaymentDate,
                                       @Param("deadlinePaymentDate") Date deadlinePaymentDate, @Param("calenderId") Long calenderId);

    /**
     * 乐团最后一次交费信息
     *
     * @param musicGroupId
     * @return
     */
    MusicGroupPaymentCalender getLastStartOne(@Param("musicGroupId") String musicGroupId);

    int queryIntersectionByDate(@Param("musicGroupId") String musicGroupId, @Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * @param musicGroupId:
     * @param payUserType:
     * @param paymentValidStartDate:
     * @param paymentValidEndDate:
     * @return int
     * @describe 根据指定乐团的有效日期查询交集
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/21
     * @time 10:46
     */
    int queryIntersectionByValidDate(@Param("musicGroupId") String musicGroupId, @Param("payUserType") PayUserType payUserType,
                                     @Param("paymentValidStartDate") Date paymentValidStartDate,
                                     @Param("paymentValidEndDate") Date paymentValidEndDate,
                                     @Param("calenderId") Long calenderId);

    /**
     * @param configValue:
     * @return void
     * @describe 获取指定时间后的缴费信息
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/9/21
     * @time 17:35
     */
    List<Map<Long, Long>> queryCalenderByDay(@Param("configValue") String configValue, @Param("format") String format);

    List<MusicGroupPaymentCalender> queryByIds(@Param("calenderId") Set<Long> calenderId);

    List<Long> queryEndIds(@Param("configValue") String configValue, @Param("format") String format);

    List<CalenderPushDto> getCalenderPushDto(@Param("calenderIds") Collection<Long> calenderIds);

    List<CalenderPushDto> getMusicCalenderPushDto(@Param("configValue") String configValue, @Param("format") String format);

    /**
     * @param musicGroupId:
     * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender
     * @describe 获取乐团下未使用的最早的缴费记录
     * @author Joburgess
     * @date 2020.10.27
     */
    MusicGroupPaymentCalender getMusicGroupUnusedFirstPaymentCalender(@Param("musicGroupId") String musicGroupId,
                                                                      @Param("studentIds") List<Integer> studentIds);

    /**
     * @param calenderIds:
     * @return com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender
     * @describe 获取指定缴费日历中下未使用的最早的缴费记录
     * @author Joburgess
     * @date 2020.10.27
     */
    MusicGroupPaymentCalender getUnusedFirstPaymentCalenderWithCalenders(@Param("calenderIds") List<Long> calenderIds);

    /**
     * @param batchNo: 批次号
     * @return java.util.List<com.ym.mec.biz.dal.entity.MusicGroupPaymentCalender>
     * @describe 根据批次号获取缴费日历
     * @author Joburgess
     * @date 2020.10.30
     */
    List<MusicGroupPaymentCalender> findByBatchNo(@Param("batchNo") String batchNo);


    /**
     * @param params:
     * @return int
     * @describe 乐团缴费日历审核列表
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/10/30
     * @time 13:47
     */
    int countAuditList(Map<String, Object> params);

    /**
     * @param params:
     * @return int
     * @describe 乐团缴费日历审核列表
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/10/30
     * @time 13:47
     */
    List<MusicGroupPaymentCalenderAuditDto> queryAuditList(Map<String, Object> params);

    /**
     * 统计预计缴费人数
     *
     * @param id
     * @return
     */
    List<Map<Long, Long>> countExpectNum(@Param("id") Long id);

    /**
     * 统计预计缴费人数
     *
     * @param id
     * @return
     */
    List<Map<Long, Long>> countActualNum(@Param("id") Long id);

    /**
     * @param batchNo:
     * @return com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto
     * @describe 获取审核详情
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/11/2
     * @time 17:46
     */
    MusicGroupPaymentCalenderAuditDto getAuditDetail(@Param("batchNo") String batchNo);

    /**
     * 获取乐团的报名缴费日历
     *
     * @param musicGroupId
     * @return
     */
    MusicGroupPaymentCalender findByMusicGroupRegCalender(@Param("musicGroupId") String musicGroupId);

    /**
     * @param calenderId:
     * @return java.lang.String
     * @describe 获取收费标准名称
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/11/4
     * @time 10:11
     */
    String getCalenderSettingsName(Long calenderId);

    /**
     * @param musicGroupId:
     * @param calenderId:
     * @return int
     * @describe 统计乐团还在审核中或者审核被拒的缴费
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/11/4
     * @time 10:37
     */
    int countAuditReject(@Param("musicGroupId") String musicGroupId, @Param("calenderId") Long calenderId);

    /**
     * 获取乐团报名的缴费日历
     *
     * @param musicGroupId
     * @return
     */
    MusicGroupPaymentCalender getMusicGroupRegCalender(@Param("musicGroupId") String musicGroupId);

    /**
     * @param userId:
     * @param musicGroupId:
     * @return java.util.Map<java.lang.String, java.lang.String>
     * @describe 获取学员在乐团的缴费状态
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/11/4
     * @time 15:43
     */
    List<Map<String, String>> queryUserPaymentStatus(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);

    /**
     * @param studentId:
     * @param musicGroupId:
     * @return java.util.List<java.util.Map < java.lang.Integer, java.lang.String>>
     * @describe 获取学员再乐团的缴费状态
     * @apiNote 时光荏苒，认真工作的时间总是过得很快，而我、享受这一刻！
     * @author zouxuan
     * @date 2020/11/11
     * @time 14:03
     */
    List<Map<Integer, String>> queryUserCoursePaymentStatus(@Param("studentId") Set studentId, @Param("musicGroupId") String musicGroupId);

    /**
     * 缴费预计人数减一
     *
     * @param userId
     * @author
     */
    void cutCalenderExpectNum(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);

    /**
     * 获取需要删除的缴费项
     *
     * @param userId
     * @param musicGroupId
     * @return
     * @author zouxuan
     */
    List<Long> findStudentNoPaymentCalender(@Param("userId") Integer userId, @Param("musicGroupId") String musicGroupId);

    /**
     * @param calenderIds
     */
    void delByIds(@Param("calenderIds") List<Long> calenderIds);

    /**
     * 根据批次号，学员编号和课程类型查询
     *
     * @param batchNo
     * @param studentId
     * @return
     * @author zouxuan
     */
    Set<Long> findByBatchNoAndStudentId(@Param("batchNo") String batchNo, @Param("studentId") Integer studentId);

    /**
     * 根据calenderIds获取学校缴费项
     *
     * @param calenderIds
     * @return
     */
    List<MusicGroupPaymentCalender> getPaymentCalenderWithCalenderIdsAndPayUserType(@Param("calenderIds") List<Object> calenderIds, @Param("payUserType") PayUserType payUserType);

    /**
     * 获取学校审核通过的缴费项
     *
     * @param calenderId
     * @return
     */
    MusicGroupPaymentCalender getSchoolCalender(@Param("calenderId") Long calenderId);

}
