package com.yanzuoguang.mq.service;

import com.rabbitmq.client.Channel;
import com.yanzuoguang.mq.vo.MessageVo;
import com.yanzuoguang.mq.vo.QueueVo;
import com.yanzuoguang.mq.vo.req.ServerMessageReqVo;
import com.yanzuoguang.mq.vo.req.ServerQueueReqVo;
import com.yanzuoguang.mq.vo.req.RegisterServerTokenReqVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;

/**
 * 消息队列服务
 *
 * @author 颜佐光
 */
public interface MqService {
    /**
     * 创建队列
     *
     * @param req 需要发送的消息
     * @return 创建队列
     */
    @ApiOperation(value = "创建队列")
    String createQueue(QueueVo req);

    /**
     * 发送消息
     *
     * @param req 需要发送的消息
     * @return 消息编号,但是没有任何意义,发送成功会更改
     */
    @ApiOperation(value = "发送消息")
    String message(MessageVo req);

    /**
     * 发送消息
     *
     * @param req 需要发送的消息
     * @param now 是否立即发送
     * @return 消息编号,但是没有任何意义,发送成功会更改
     */
    @ApiOperation(value = "发送消息")
    String message(MessageVo req, boolean now);

    /**
     * 发送错误消息
     *
     * @param req
     * @return
     */
    @ApiOperation(value = "发送错误消息")
    String messageError(MessageVo req);

    /**
     * 消息收到确认
     *
     * @param message 收到的消息
     * @param channel  收到的通道
     */
    @ApiOperation(value = "消息收到确认")
    void basicAck(Message message, Channel channel);

    /**
     * 删除当前服务器的队列
     *
     * @param req 请求数据
     * @return
     */
    String removeServerQueue(ServerQueueReqVo req);

    /**
     * 建立当前服务器的队列
     *
     * @param req      请求数据
     * @return
     */
    @ApiOperation(value = "建立当前服务器的队列")
    String createServerQueue(ServerQueueReqVo req);

    /**
     * 注册当前消费队列的回调
     *
     * @param req      请求数据
     * @param listener 处理函数
     * @return
     */
    @ApiOperation(value = "注册当前消费队列的回调")
    String setServerQueueConsumer(ServerQueueReqVo req, ChannelAwareMessageListener listener);

    /**
     * 注册当前服务器的token,超期后需要重新注册
     *
     * @param req
     * @return
     */
    @ApiOperation(value = "注册当前服务器的token,超期后需要重新注册")
    String registerServerToken(RegisterServerTokenReqVo req);

    /**
     * 删除token的执行
     *
     * @param req
     */
    @ApiOperation(value = "删除token的执行")
    void removeToken(RegisterServerTokenReqVo req);

    /**
     * 发送给指定服务器消息
     *
     * @param req
     * @return
     */
    @ApiOperation(value = "发送给指定服务器消息")
    String sendServerMessage(ServerMessageReqVo req);
}