package io.wdd.rpc.message.handler;


import io.wdd.common.handler.MyRuntimeException;
import io.wdd.rpc.message.OctopusMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayDeque;
import java.util.HashMap;

import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
import static io.wdd.common.config.OctopusObjectMapperConfig.WriteToString;

@Configuration
@Slf4j(topic = "Octopus Message Listener")
public class OMessageToServerListener {

    /**
     * Redis Key 用于保存Agent的最新版本
     * 由 GitHubAction发送至 RabbitMQ中，然后此处获取处理，发送至Redis中
     */
    public static final String LATEST_VERSION = "LATEST_VERSION";

    /**
     * 存储所有的从 Agent过来的 OctopusMessage
     * 各个业务模块需要自己手动去获取自己需要的内容
     *   TODO 数据一致性问题，当AgentShutDown可能有一些信息会消失
     */
    public static ArrayDeque<OctopusMessage> OCTOPUS_MESSAGE_FROM_AGENT = new ArrayDeque<>(
            128
    );

    /**
     * 发送出去的OctopusMessage需要和返回回来的内容对比
     * 返回来的OM反序列化之后就不是原对象，需要进行 通过MatchKey比较
     * 2023年8月11日 修改为OMessageReplayContent
     * <p>
     * omMatchKey -- OMessageReplayContent
     */
    public static HashMap<String, OMessageReplayContent> FROM_AGENT_MATCH_TO_AGENT_MAP = new HashMap<>();

    @Resource
    RedisTemplate redisTemplate;


    @RabbitHandler
    @RabbitListener(queues = "${octopus.message.octopus_to_server}"
    )
    public void HandleOctopusMessageFromAgent(Message message) {

        OctopusMessage octopusMessage;

        try {
            octopusMessage = OctopusObjectMapper.readValue(
                    message.getBody(),
                    OctopusMessage.class
            );
        } catch (IOException e) {
            throw new MyRuntimeException("Octopus Message Wrong !");
        }

        // Octopus Message Handler
        log.info(
                "received from agent : {} ",
                WriteToString(octopusMessage)
        );


        // 获取Agent的版本信息
        if (octopusMessage
                .getUuid()
                .equals("Octopus-Version")) {
            // 更新缓存Agent的最新版本信息
            String latestVersion = (String) octopusMessage.getResult();

            log.info(
                    "开始向Redis中缓存Agent的最新版本 => {}",
                    latestVersion
            );

            redisTemplate
                    .opsForValue()
                    .set(
                            LATEST_VERSION,
                            latestVersion
                    );

        }

        // 将收到的消息,直接存储到 缓存队列中
        log.debug("cache the octopus message to inner cache list !");
        OCTOPUS_MESSAGE_FROM_AGENT.offer(octopusMessage);

    }
}
