package jnpf.notice.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import jnpf.model.cultivate.dto.learn.BatchCommonCountDto;
import jnpf.model.notice.domain.FtbNoticeAnnouncementsReceive;
import jnpf.model.notice.dto.FtbNoticeAnnouncementsReceiveDto;
import jnpf.model.notice.enums.NoticeEnums;
import jnpf.model.notice.req.announcement.QueryUserListReq;

import java.util.List;

/**
 * @author 许贵林
 * @description 针对表【ftb_notice_announcements_receive(公告用户接收表)】的数据库操作Service
 * @createDate 2024-05-08 09:42:09
 */
public interface FtbNoticeAnnouncementsReceiveService extends IService<FtbNoticeAnnouncementsReceive> {

    /**
     * 根据公告ID查询用户
     *
     * @param announcementId 公告ID
     */
    List<FtbNoticeAnnouncementsReceiveDto> queryUserList(String announcementId);

    /**
     * 根据阅读状态 查询公告的用户
     *
     * @param req
     * @param selectUserOrgAndPosition 是否查询用户组织及职位 true 查询 false 不查询
     */
    PageInfo<FtbNoticeAnnouncementsReceiveDto> queryUserListForReadStatus(QueryUserListReq req, Boolean selectUserOrgAndPosition);


    /**
     * 根据提醒状态 查询公告的用户
     *
     * @param announcementId 公告ID
     * @param alertStatus    提醒状态 1未提醒 2已提醒
     * @return
     */
    List<FtbNoticeAnnouncementsReceiveDto> queryUserListForAlertStatus(String announcementId, Integer alertStatus);

    /**
     * 添加公告接收用户
     *
     * @param announcementsId 公告ID
     * @param userList        接收用户列表
     */
    List<FtbNoticeAnnouncementsReceive> addReceiveUser(String announcementsId, List<String> userList);

    /**
     * 删除公告接收用户
     *
     * @param announcementsId 公告ID
     */
    void deleteReceiveUser(String announcementsId);

    /**
     * 取消接收用户通知
     *
     * @param announcementId 通知的唯一标识符，用于标识特定的通知
     */
    void cancelReceiveUser(String announcementId);

    /**
     * 重置通知的已读、提醒和网页取消状态
     *
     * @param announcementId 通知的唯一标识符，用于标识特定的通知
     */
    void resetReadAndAlertAndWebCancel(String announcementId);


    /**
     * 编辑公告时，处理公告接收用户
     *
     * @param announcementId 公告ID
     * @param noticeStatus
     */
    void dealAnnouncementUserWhenEdit(String announcementId, List<String> userList, NoticeEnums.NoticeStatus noticeStatus);

    /**
     * 完成提醒
     *
     * @param announcementId
     */
    void updateCompleteAlertAll(String announcementId);

    /**
     * 根据公告ID和用户ID查询用户
     *
     * 此方法旨在处理特定公告与用户的关联查询，用于获取特定公告的用户信息
     *
     * @param announcementId 公告ID，用于标识特定的公告
     * @param userId 用户ID，用于标识特定的用户
     * @return 返回包含公告和用户信息的对象，便于进一步处理和展示
     */
    FtbNoticeAnnouncementsReceive queryUserForUserId(String announcementId, String userId);


    /**
     * 修改一个用户已经完成提醒
     *
     * @param announcementId
     * @param userId
     */
    void updateCompleteAlert(String announcementId, String userId);

    /**
     * 完成阅读
     *
     * @param announcementId
     * @param userId
     */
    void updateCompleteRead(String announcementId, String userId);

    /**
     * 根据用户ID查询用户通知公告记录（忽略删除状态）
     * 此方法用于获取特定用户的通知公告记录，即使该记录被标记为已删除也能查询到
     * 主要用于后台管理或数据统计等场景，需要管理员权限
     *
     * @param announcementId 公告ID，用于标识特定的通知公告
     * @param userId 用户ID，用于标识接收通知公告的用户
     * @return 返回匹配指定公告ID和用户ID的通知公告记录，包括未删除和已删除的记录
     */
    FtbNoticeAnnouncementsReceive queryUserForUserIdIngoreDelete(String announcementId, String userId);


    /**
     * 检查查询公告 是否已读，返回未读列表
     *
     * @param userId
     * @param ids
     * @return
     */
    List<String> checkIsRead(String userId, List<String> ids);

    /**
     * 查询公告阅读状态的数量
     *
     * @param announcementId
     * @param readStatus     1未读，2已读
     * @return
     */
    Long queryReadStatusCount(String announcementId, Integer readStatus);

    /**
     * 查询未提醒用户数量
     *
     * @param announcementId
     * @return
     */
    Long queryNoAlertUserNum(String announcementId);
    /**
     * 取消网页公告提醒
     *
     * @param announcementId 公告的唯一标识符
     * @param userId 用户的唯一标识符
     */
    void cancelWebAlert(String announcementId, String userId);

    /**
     * 查询需要提醒的用户列表
     *
     * @param announcementId 公告的唯一标识符
     * @return 返回需要提醒的用户列表
     */
    List<FtbNoticeAnnouncementsReceiveDto> queryNeedAlertUserList(String announcementId);

    /**
     * 根据公告id查询用户数量
     * @param adList 公告id
     * @return 公告数量
     */
    List<BatchCommonCountDto> queryCountAcceptUserNum(List<String> adList);

    /**
     * 批量根据公告id查询用户未提醒数量
     * @param adList 公告id
     * @return 公告数量
     */
    List<BatchCommonCountDto> batchQueryNoAlertUserNum(List<String> adList);
}
