package com.apobates.forum.member.dao;

import com.apobates.forum.member.entity.MemberPenalizeRecords;
import com.apobates.forum.member.entity.MemberStatusEnum;
import com.apobates.forum.utils.persistence.Page;
import com.apobates.forum.utils.persistence.Pageable;
import com.apobates.forum.utils.persistence.PagingAndSortingRepository;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * 会员惩罚记录的持久层接口
 *
 * @author xiaofanku
 * @since 20200515
 */
public interface MemberPenalizeRecordsDao extends PagingAndSortingRepository<MemberPenalizeRecords, Long> {
    /**
     * 查看指定管理者开具的惩罚记录
     *
     * @param buildMemberId 版主或管理员
     * @param pageable 分页请求参数
     * @return
     */
    Page<MemberPenalizeRecords> findAll(long buildMemberId, Pageable pageable);
    
    /**
     * 查看指定会员的可用惩罚记录
     *
     * @param memberId 会员ID
     * @return
     */
    Stream<MemberPenalizeRecords> findAllByMember(long memberId);
    
    /**
     * 查看指定日期范围内可用的惩罚记录,MemberPenalizeRecords.rebirthDateTime为参考
     *
     * @param start 开始日期
     * @param finish 结束日期
     * @return
     */
    Stream<MemberPenalizeRecords> findAllByExpire(LocalDateTime start, LocalDateTime finish);
    
    /**
     * 将指定惩罚记录的作废
     *
     * @param id 惩罚记录ID
     * @return
     */
    Optional<Boolean> expired(long id);
    
    /**
     * 将指定惩罚记录的作废
     *
     * @param idList 惩罚记录ID列表
     * @return
     */
    int expired(Collection<Long> idList);

    /**
     * 统计指定会员的惩罚记录
     *
     * @param memberId 会员ID
     * @return
     */
    long countForMember(long memberId);
}