package cn.axzo.msg.center.notices.manager.api;

import cn.axzo.msg.center.domain.entity.MNSMessage;
import cn.axzo.msg.center.domain.entity.MNSMessageRedo;
import cn.axzo.msg.center.notices.common.lang.Page;
import cn.axzo.msg.center.notices.manager.api.dto.request.MessageQueryRequestDto;

/**
 * 消息记录管理类
 *
 * @author zhaoyong_sh
 * @see MessageManager
 * @since 2021-05-19 15:54
 */
public interface MessageManager {

  /**
   * 分页查询消息记录
   *
   * @param requestDto
   * @return
   */
  Page<MNSMessage> queryPageByMessageQueryRequestDto(MessageQueryRequestDto requestDto);

  /**
   * 保存消息
   *
   * @param message
   * @return
   */
  boolean saveMessage(MNSMessage message);

  /**
   * 保存重试消息
   *
   * @param messageRedo
   * @return
   */
  boolean saveMessageRedo(MNSMessageRedo messageRedo);

  /**
   * 更新为处理中
   *
   * @param bizId
   * @param requestId
   * @param id
   * @return
   */
  boolean updateToProcessing(String bizId, String requestId, Long id);

  /**
   * 渠道业务异常
   *
   * @param id
   * @return
   */
  boolean updateToFail(Long id);

  /**
   * 网络异常
   *
   * @param id
   * @param messageRedo
   * @return
   */
  boolean updateToException(MNSMessageRedo messageRedo, Long id);

  /**
   * 修改定时任务异常到查询状态
   *
   * @param targetStatus
   * @param id
   * @return
   */
  boolean updateExceptionToQueryStatus(String targetStatus, Long id);

  /**
   * 根据messageOrderNo和phoneNumber查询message
   *
   * @param messageOrderNo
   * @param phoneNumber
   * @return
   */
  MNSMessage queryMessageByMessageOrderNoAndPhoneNumber(String messageOrderNo, String channelBizId, String phoneNumber);

  /**
   * 根据id更新状态
   *
   * @param id
   * @param status
   * @return
   */
  boolean updateProcessingMessageStatusById(Long id, String status);

  /**
   * 根据messageOrderNo更新状态
   *
   * @param messageOrderNo
   * @param status
   * @return
   */
  boolean updateMessageStatusByMessageOrderNo(String messageOrderNo, String status);

  /**
   * 更新为成功
   * @param bizId
   * @param requestId
   * @param id
   * @return
   */
  boolean updateToSuccess(String bizId, String requestId, Long id);

}
