package com.qmth.themis.business.service.impl;

import com.qmth.themis.business.constant.SystemConstant;
import com.qmth.themis.business.dto.MqDto;
import com.qmth.themis.business.enums.MqTagEnum;
import com.qmth.themis.business.service.MqDtoService;
import com.qmth.themis.business.service.ProducerServer;
import com.qmth.themis.business.util.RedisUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * @Description: mqdto 服务实现类
 * @Param:
 * @return:
 * @Author: wangliang
 * @Date: 2020/7/2
 */
@Service
public class MqDtoServiceImpl implements MqDtoService {
    private final static Logger log = LoggerFactory.getLogger(MqDtoServiceImpl.class);

    @Resource
    ProducerServer producerServer;

    @Resource
    RedisUtil redisUtil;

    /**
     * 组装单向消息
     *
     * @param mqDto
     * @return
     */
    @Override
    public MqDto assembleSendOneWayMsg(MqDto mqDto) {
        mqDto.setAck(SystemConstant.DELIVERED_ACK_TYPE);
        try {
            producerServer.sendOneWay(mqDto);
        } catch (Exception e) {
            log.error("请求出错", e);
            if (Objects.nonNull(mqDto)) {
                mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
            }
        } finally {
            setTopicBuffer(mqDto);
        }
        return null;
    }

    /**
     * 组装异步延时消息
     *
     * @param mqDto
     * @return
     */
    @Override
    public MqDto assembleSendAsyncDelayMsg(MqDto mqDto) {
        mqDto.setAck(SystemConstant.DELIVERED_ACK_TYPE);
        try {
            producerServer.asyncDelayMsg(mqDto);
        } catch (Exception e) {
            log.error("请求出错", e);
            if (Objects.nonNull(mqDto)) {
                mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
            }
        } finally {
            setTopicBuffer(mqDto);
        }
        return null;
    }

    /**
     * 组装同步延时消息
     *
     * @param mqDto
     * @return
     */
    @Override
    public MqDto assembleSendSyncDelayMsg(MqDto mqDto) {
        mqDto.setAck(SystemConstant.DELIVERED_ACK_TYPE);
        try {
            producerServer.syncDelayMsg(mqDto);
        } catch (Exception e) {
            log.error("请求出错", e);
            if (Objects.nonNull(mqDto)) {
                mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
            }
        } finally {
            setTopicBuffer(mqDto);
        }
        return null;
    }

    /**
     * 组装事务消息
     *
     * @param mqDto
     * @return
     */
    @Override
    public MqDto assembleSendTranMsg(MqDto mqDto) {
        mqDto.setAck(SystemConstant.DELIVERED_ACK_TYPE);
        try {
            producerServer.sendMsgTran(mqDto);
        } catch (Exception e) {
            log.error("请求出错", e);
            if (Objects.nonNull(mqDto)) {
                mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
            }
        } finally {
            setTopicBuffer(mqDto);
        }
        return null;
    }

    /**
     * 设置mq buffer type
     *
     * @param mqDto
     */
    void setTopicBuffer(MqDto mqDto) {
        if (Objects.nonNull(mqDto)) {
            if (Objects.equals(mqDto.getType().getType(), "normal")) {
                redisUtil.set(SystemConstant.MQ_TOPIC_BUFFER_LIST, mqDto.getId(), mqDto);
            } else {
                redisUtil.set(SystemConstant.MQ_DELAY_TOPIC_BUFFER_LIST, mqDto.getId(), mqDto);
            }
        }
    }
}
