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.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;

/**
 * 消息队列服务
 *
 * @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 queueName       队列名称
     * @param messageListener  消费者
     * @return
     */
    @ApiOperation(value = "动态注册消费者回调队列")
    SimpleMessageListenerContainer setQueueConsumer(String queueName, ChannelAwareMessageListener messageListener);

    /**
     * 动态注册消费者回调队列
     *
     * @param queueName       队列名称
     * @param concurrency      消费者数量
     * @param messageListener  消费者
     * @return
     */
    @ApiOperation(value = "动态注册消费者回调队列")
    SimpleMessageListenerContainer setQueueConsumer(String queueName, int concurrency, ChannelAwareMessageListener messageListener);

    /**
     * 动态注册消费者回调队列
     *
     * @param queueName       队列名称
     * @param concurrency      消费者数量
     * @param maxConcurrency   最大消费者数量
     * @param messageListener  消费者
     * @return
     */
    @ApiOperation(value = "动态注册消费者回调队列")
    SimpleMessageListenerContainer setQueueConsumer(String queueName, int concurrency, int maxConcurrency, ChannelAwareMessageListener messageListener);


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

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

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

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

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

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

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

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


    /**
     * 写入当前对象
     *
     * @param message 当前消息的内容
     * @return
     */
    @ApiOperation(value = "写入当前对象")
    void logCurrent(Message message);

    /**
     * 删除当前对象
     *
     * @return
     */
    @ApiOperation(value = "写入当前对象")
    void logCurrentRemove();

    /**
     * 记录一个消息已完成
     *
     * @return
     */
    @ApiOperation(value = "记录一个消息已完成,重复时抛出CodeException异常")
    String log();

    /**
     * 记录一个消息已完成
     *
     * @param req 消息的内容
     * @return
     */
    @ApiOperation(value = "记录一个消息已完成,重复时抛出CodeException异常")
    String log(MessageLogReqVo req);

    /**
     * 删除一个消息
     *
     * @param req 消息的内容
     * @return
     */
    @ApiOperation(value = "删除一个消息")
    String logRemove(MessageLogRemoveReqVo req);

    /**
     * 删除日期
     *
     * @param day
     */
    @ApiOperation(value = "删除日期")
    void logClear(String day);


}