package cn.axzo.msg.center.inside.notices.service;

import cn.axzo.msg.center.api.enums.MsgStateEnum;
import cn.axzo.msg.center.api.enums.MsgTypeEnum;
import cn.axzo.msg.center.api.request.MessagePageQueryReq;
import cn.axzo.msg.center.api.response.MessageDetailRes;
import cn.axzo.msg.center.domain.dto.MessagePageQueryDTO;
import cn.azxo.framework.common.model.Page;

import javax.annotation.Nullable;
import javax.validation.constraints.NotEmpty;
import java.util.Collection;
import java.util.Optional;

/**
 * @description
 *   原始的消息记录数据源Service
 *
 * @author cold_blade
 * @date 2023/9/13
 * @version 1.0
 */
public interface RawMessageRecordService {

    /**
     * 更新个人消息记录的状态
     *
     * @param personId    自然人id
     * @param srcStates   原状态集合
     * @param tgtState    目标状态
     * @param msgId       消息id
     */
    void updatePersonMessageState(Long personId, Collection<MsgStateEnum> srcStates, MsgStateEnum tgtState, Long msgId);

    /**
     * 更新个人消息记录的状态
     *
     * @param personId    自然人id
     * @param srcStates   原状态集合
     * @param tgtState    目标状态
     * @param msgType     消息类型
     * @param identifyId  身份id，可为null
     * @param moduleIds   模块id集合，可为null
     */
    void updatePersonMessageState(Long personId, Collection<MsgStateEnum> srcStates, MsgStateEnum tgtState,
                                  MsgTypeEnum msgType, @Nullable Long identifyId, @Nullable Collection<Long> moduleIds);

    /**
     * 统计个人指定状态的消息记录数量
     *
     * @param personId    自然人id
     * @param msgType     消息类型
     * @param identifyId  身份id，可为null
     * @param moduleIds   模块id集合，可为null
     * @param states      指定状态列表，可为null
     * @return 个人指定状态的消息记录数量
     */
    int countPersonMessage(Long personId, MsgTypeEnum msgType, @Nullable Long identifyId,
                           @Nullable Collection<Long> moduleIds, @Nullable Collection<MsgStateEnum> states);

    /**
     * 查询个人最新一条消息记录，优先选择未读或未处理的
     *
     * @param personId         自然人id
     * @param identifyId       身份id
     * @param moduleIds        模块id集合，可为null
     * @param routerType       路由类型
     * @return 个人最新一条消息记录
     */
    Optional<MessageDetailRes> selectLatestOnePersonMessage(Long personId, MsgTypeEnum msgType, String routerType,
                                                            @Nullable Long identifyId,
                                                            @Nullable Collection<Long> moduleIds);

    /**
     * 分页查询个人的消息记录
     *
     * @param request 分页查询的条件
     * @return 消息记录列表
     */
    Page<MessageDetailRes> pagePersonMessages(MessagePageQueryDTO request);
}
