package com.njcn.msgpush.module.push.service.retry;

import com.njcn.msgpush.framework.common.pojo.PageResult;
import com.njcn.msgpush.module.push.controller.admin.retry.vo.MessageRetryQueueReqVO;
import com.njcn.msgpush.module.push.dal.dataobject.message.MessageRecordDO;
import com.njcn.msgpush.module.push.dal.dataobject.retry.MessageRetryQueueDO;

import java.util.List;

public interface MessageRetryQueueService {
    /**
     * 添加消息到重试队列
     *
     * @param message 消息
     */
    void saveOrUpdateRetryMessage(MessageRecordDO message);

    /**
     * 批量处理重试消息
     *
     * @param channel 渠道类型
     */
    void processRetryBatch(String channel);

    /**
     * 手动触发重试
     *
     * @param messageIds 消息ID列表
     * @return 是否成功
     */
    void manualRetry(List<String> messageIds);

    /**
     * 分页查询重试队列
     *
     * @param reqVO 查询条件
     * @return 分页结果
     */
    PageResult<MessageRetryQueueDO> getPage(MessageRetryQueueReqVO reqVO);

    boolean deleteByMessageIds(List<Long> messageIds);

    /**
     * 应用启动时重建重试队列
     */
    void rebuildRetryQueueOnStartup();

    /**
     * 定时同步数据库和 Redis 的重试队列一致性
     */
    void syncRetryQueueConsistency();

    /**
     * 从数据库兜底读取待重试消息并回填 Redis
     *
     * @param channel 渠道类型
     */
    void fallbackToDatabase(String channel);
}
