package jnpf.notice.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import jnpf.model.notice.domain.FtbNoticeAnnouncements;
import jnpf.model.notice.dto.*;
import jnpf.model.notice.req.announcement.*;

import java.util.List;

/**
 * @author 许贵林
 * @description 针对表【ftb_notice_announcements(公告表)】的数据库操作Service
 * @createDate 2024-05-08 09:42:09
 */
public interface FtbNoticeAnnouncementsService extends IService<FtbNoticeAnnouncements> {

    /**
     * Web端管理员查询公告列表
     *
     * @param req
     * @return
     */
    PageInfo<FtbNoticeAnnouncementsDto> getWebPageList(QueryAnnouncementListReq req);

    /**
     * 新增公告
     * @param req
     * @return
     */
    FtbNoticeAnnouncements insertData(AddNoticeAnnouncementsReq req);

    /**
     * 修改公告
     * @param id 公告id
     * @param req
     * @return
     */
    FtbNoticeAnnouncements updateData(String id, UpdateNoticeAnnouncementsReq req);

    /**
     * 查询公告基本信息
     * @param id 公告id
     * @param terminal 终端【web or app】
     * @return
     */
    FtbNoticeAnnouncementsDetailDto getInfo(String id,String terminal);

    /**
     * 发布公告
     * @param id 公告id
     */
    void publish(String id);

    /**
     * 删除公告
     * @param id 公告id
     */
    void deleteData(String id);

    /**
     * 提醒公告
     * @param announcementId 公告id
     * @param userId 用户id
     */
    void alertOne(String announcementId, String userId);

    /**
     * 提醒公告相关的所有用户
     * @param announcementId 公告id
     */
    void alertAll(String announcementId);

    /**
     * 取消发布
     * @param id 公告id
     */
    void cancelPublish(String id);

    /**
     * 分页查询当前用户的公告列表
     * @param req
     * @return
     */
    PageInfo<MyNoticeAnnouncementsDto> getMyWebPageList(QueryMyWebAnnouncementListReq req);
    /**
     * 获取个人公告详情
     *
     * @param announcementId 公告ID，用于标识特定的公告
     * @param userId 用户ID，用于标识请求公告信息的用户
     * @return 返回一个MyNoticeAnnouncementsDetailDto对象，包含公告的详细信息
     */
    MyNoticeAnnouncementsDetailDto getMyAnnouncementInfo(String announcementId, String userId);

    /**
     * 查询所有未读消息
     *
     * @param userId   用户ID
     * @param needRead 0:全部 1：非必读，2：必读
     * @return
     */
    List<MyNoticeAnnouncementsMsgDto> queryAllMyNoRead(String userId, Integer num, Integer needRead);

    /**
     * 查询用户的最近的几条公告
     * @param userId 用户ID
     * @param num 数量
     * @return
     */
    List<MyNoticeAnnouncementsDto> queryMyLatest(String userId, Integer num);

    /**
     * 获取当前用户公告列表的分页信息
     *
     * @param req 查询当前用户公告列表的请求参数，包括分页信息和查询条件等
     * @return 返回包含当前用户公告列表的分页信息对象，其中包含公告数据和分页元数据
     */
    PageInfo<MyNoticeAnnouncementsDto> getAppMyPageList(AppQueryMyAnnouncementListReq req);

    /**
     * 获取应用公告分页列表
     *
     * @param req 查询应用公告列表的请求对象，包含查询条件和分页信息
     * @return 返回包含公告列表的分页信息的Dto（数据传输对象）对象
     */
    PageInfo<FtbNoticeAnnouncementsDto> getAppPageList(AppQueryAnnouncementListReq req);

    /**
     * 定时检测定时发布的公告，到时间点就发布公告
     * @param tenantId 租户id
     */
    void checkPublishNotice(String tenantId);

    /**
     * 完成阅读
     *
     * @param announcementId 公告ID
     * @param userId         用户ID
     */
    void completeRead(String announcementId, String userId);
    /**
     * 查询并检测公告是否存在
     * @param id 公告id
     * @return
     */
    FtbNoticeAnnouncements queryAndCheckById(String id);

    /**
     * web查询所有未读消息
     *
     * @param userId   用户ID
     * @param needRead 0:全部 1：非必读，2：必读
     * @return
     */
    List<MyNoticeAnnouncementsMsgDto> queryAllWebMyNoRead(String userId, Integer needRead);
}
