package com.zcloud.Kafka;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.zcloud.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.concurrent.TimeUnit;

import static com.zcloud.common.utils.DateUtils.DATE_TIME_PATTERN;

@Service
public class KafkaMessageListener {

    @Autowired
    private StringRedisTemplate redisTemplate;


    @KafkaListener(topics = "point_1", groupId = "finds1")
    public void listen(String message) {
        JSONObject json = JSONObject.parseObject(message);
        String terminalInfoStr = json.get("terminalInfo").toString();
        JSONObject terminalInfoJson = JSONObject.parseObject(terminalInfoStr);
        String terminalNo = terminalInfoJson.get("terminalNo").toString();
        // 获取位置信息
        JSONObject locationJson = JSONObject.parseObject(json.get("location").toString());
        JSONObject positionJson = JSONObject.parseObject(locationJson.get("position").toString());
        JSONObject jsonObject = new JSONObject();
        //组建新的数据结构
        jsonObject.put("latitude", positionJson.get("lat"));
        jsonObject.put("longitude", positionJson.get("lon"));
        jsonObject.put("terminalNo", terminalNo);
        // 获取卡对应的名字
        String nameList = redisTemplate.opsForValue().get("userPositionInfo");
        List<Map<String, String>> list = JSON.parseObject(nameList, new TypeReference<List<Map<String, String>>>() {});
        // 创建一个新的 Map 用于存储合并后的键值对    key:为设备号   value:为人员姓名
        Map<String, String> combinedMap = new HashMap<>();
        // 遍历列表中的每个 Map
        for (Map<String, String> subMap : list) {
            // 将子 Map 中的键值对添加到新的 Map 中
            combinedMap.putAll(subMap);
        }
        if(combinedMap.containsKey(terminalNo)) {
            jsonObject.put("MAP_POINT_NAME", combinedMap.get(terminalNo));
        }
        // 根据 terminalNo 设备号  找到redis里存在的 如果不存在  直接追加
        // 如果存在  比对时间  以时间新的为准 更新redis
        String str3 = json.get("serverTime").toString();
        jsonObject.put("serverTime", json.get("serverTime"));
        if(redisTemplate.hasKey("Kafka@"+terminalNo)){
            String redisValue = redisTemplate.opsForValue().get("Kafka@"+terminalNo);
            JSONObject redisValueJson = JSONObject.parseObject(redisValue);
            String redisValueServerTime = redisValueJson.get("serverTime").toString();
            Long a = Long.parseLong(redisValueServerTime);
            Long b = Long.parseLong(str3);
            if(a<b){
                redisTemplate.opsForValue().set("Kafka@"+terminalNo, jsonObject.toJSONString());
                redisTemplate.expire("Kafka@"+terminalNo, 30, TimeUnit.MINUTES);
            }
        }else {
            redisTemplate.opsForValue().set("Kafka@"+terminalNo, jsonObject.toJSONString());
            redisTemplate.expire("Kafka@"+terminalNo, 30, TimeUnit.MINUTES);
        }
    }
}
