package com.theembers.iot.redis;

import com.theembers.iot.GlobalInfo;
import com.theembers.iot.IotInfo;
import com.theembers.iot.utils.JsonUtils;
import com.theembers.iot.utils.KeyUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static com.theembers.iot.GlobalInfo.Global_Iot_Redis_Key;

/**
 * 物联网 service
 *
 * @author TheEmbers Guo
 * @version 1.0
 * createTime 2018-10-26 16:36
 */
@Service
public class IoTService {
    private static final Logger LOGGER = LoggerFactory.getLogger(IoTService.class);

    @Autowired
    private RedisService redisService;

    /**
     * 加载 IoT 映射信息到 全局
     *
     * @param host
     * @param port
     * @return
     */
    public boolean loadIotMapper2Global(String host, Integer port) throws Exception {
        if (GlobalInfo.iotMapper == null) {
            Global_Iot_Redis_Key = KeyUtils.buildKey(host, port);
            GlobalInfo.iotMapper = this.getIoTSnIdMapper(Global_Iot_Redis_Key);
        }
        if (CollectionUtils.isEmpty(GlobalInfo.iotMapper)) {
            return false;
        }
        return true;
    }

    /**
     * 刷新 全局 IoT 映射信息
     *
     * @return
     * @throws Exception
     */
    public boolean refreshIotMapper2Global() throws Exception {
        GlobalInfo.iotMapper = this.getIoTSnIdMapper(Global_Iot_Redis_Key);
        if (CollectionUtils.isEmpty(GlobalInfo.iotMapper)) {
            return false;
        }
        return true;
    }

    /**
     * 获取 IoT 映射信息
     */
    private Map<String, IotInfo> getIoTSnIdMapper(String key) throws Exception {
        LOGGER.info("get IoT SnId Mapper... key is [{}]", key);
        Map<Object, Object> mapperMap = redisService.hGetAll(key);
        if (CollectionUtils.isEmpty(mapperMap)) {
            LOGGER.warn("the IoTSnIdMapper is empty!");
            return new HashMap<>(0);
        }

        Map<String, IotInfo> mapperStrMap = new HashMap<>(mapperMap.size());
        Set<Object> keySet = mapperMap.keySet();
        for (Object sn : keySet) {
            Object data = mapperMap.get(sn);
            IotInfo dataMap = JsonUtils.jsonStr2Obj(String.valueOf(data), IotInfo.class);
            mapperStrMap.put(String.valueOf(sn), dataMap);
        }
        return mapperStrMap;
    }
}