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


import cn.axzo.core.domain.PageResult;
import cn.axzo.msg.center.api.enums.MsgStateEnum;
import cn.axzo.msg.center.api.request.*;
import cn.axzo.msg.center.api.response.MessageNewRes;
import cn.axzo.msg.center.api.response.MessageRecordRes;
import cn.axzo.msg.center.api.response.MessageTotalRes;
import cn.axzo.msg.center.domain.dto.UpdateReadDTO;
import cn.axzo.msg.center.domain.entity.MessageRecord;
import cn.axzo.msg.center.domain.enums.UserTypeEnum;
import cn.axzo.msg.center.service.dto.IdentityDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;

/**
 * 消息记录(MessageRecord)表服务接口
 *
 * @author zhangran
 * @since 2022-03-28 14:59:16
 */
public interface MessageRecordService {

  /**
   * 新增推送消息接口
   *
   * @param message
   * @return 消息唯一主键
   */
  List<MsgReturnParamRes> pushMsg(GeneralMessageReq message);

  MessageTotalRes statisticsMsg4Total(Long userId, Long personId, UserTypeEnum userTypeEnum);

  /**
   * 变更执行消息的状态
   *
   * @return
   */
  Boolean changeMessageState(List<Long> msgId, MsgStateEnum state);

  Boolean changeMessageState(Long toId, Long relationId, Long bizId, MsgStateEnum state);

  void updateReadMsgStatus(CmsReadMsgReq req);

  PageResult<MessageNewRes> pageMsgInfo(CmsMsgQueryReq req, Long personId, List<IdentityDTO> identities);

  PageResult<MessageNewRes> pageMsgInfo4WechatAndTrade(CmsMsgQueryReq req, Long personId);


  /**
   * 查询所有发送失败的消息
   */
  IPage<MessageRecord> querySendFailMsg(IPage<MessageRecord> page);

  MessageTotalRes statisticsMsg4Construction(Long identityId, UserTypeEnum userTypeEnum);

  MessageTotalRes statisticsMsg4Trade(Long personId);

  Boolean changeHasRead(UpdateReadDTO request);

  IPage<MessageRecordRes> queryUnReadList(QueryMessageRecordReq request);

  IPage<MessageRecordRes> querySent(QueryMessageRecordReq request);

  /**
   * 批量删除消息记录，支持以下两种方式
   * 1. 传入待删除的消息记录id列表
   * 2. 传入消息模块与模板关联关系的id
   * 两个属性必须有一个有效，否则服务端将不进行任何处理
   * 注意：
   * 1. 为了防止由于一次行传入超大量的消息记录的id导致MySql所加的行锁过多，服务端会对传入的消息记录的id列表限制，最好不要超过500
   * 2. 通过relationId的方式删除，服务端在做删除的时候无法预知具体的行数，因此要甚用该参数
   *
   * @param request 消息记录的id列表 OR 消息模块与模板的关联关系id
   * @return 成功删除返回 {@code true}，否则返回 {@code false}
   */
  boolean deleteMessageRecords(MessageRecordDeleteReq request);
  Integer unReadStatistics(MessageStatisticsReq request);

  IPage<MessageRecordRes> queryMessageRecordList(MessageRecordReq request);

  void updateStateReceive(List<Long> msgIdList);
}
