package com.fastbee.deviceData.api.devlink.service;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fastbee.common.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

@Component
public class ZhanLianBaseService {

    @Autowired
    private ZhanLianAuthorizationService authorizationService;




    /**
     * 基本请求
     * @param body 请求负载
     * @return 请求结果 data
     */
    public JSONObject baseRequest(Map<String,Object> body){
        String jsonStr = JSONUtil.toJsonStr(body);
        String respStr = HttpUtil.post(authorizationService.getAuthEndpoint(), jsonStr);
        JSONObject resp = JSONUtil.parseObj(respStr);
        if(!resp.get("code").toString().equals("200")){
            throw new ServiceException(resp.get("message").toString());
        }
        return resp.getJSONObject("data");
    }




    /**
     * 请求设备实时数据
     * @param deviceId 设备id
     * @return 实时数据
     */
    private JSONObject requestDeviceData(String deviceId) {
        //构建请求体
        HashMap<String, Object> body = new HashMap<>();
        body.put("method","get");
        body.put("path","api/v1/product/device/run_status");
        Map<String,Object> params=new HashMap<>();
        params.put("id", deviceId);
        body.put("params",params);
        return baseRequest(body);
    }



    /**
     * 根据设备id请求数据并解析设备实时数据为易于存储的map键值对
     * @param deviceId 设备id
     * @return 实时数据
     */
    public Map<String,String> getDeviceRealTimeData(String deviceId){
        //解析返回数据
        JSONObject data =  requestDeviceData(deviceId);
        //获取设备状态
        JSONObject jsonObjectData = JSONUtil.parseObj(data);
        Object status = jsonObjectData.get("status");
        //获取设备属性以及实时数据值
        Object properties = jsonObjectData.get("properties");
        //获取数据上报时间
        String time = jsonObjectData.get("lastOnlineTime").toString();
        JSONArray propertiesArray = JSONUtil.parseArray(properties);
        //获取设备各项属性实时数据
        //设备属性与值建立map
        Map<String, String> propertiesMap = new HashMap<>();
        propertiesArray.forEach(p -> {
            Object property = JSONUtil.parseObj(p).get("property");
            JSONObject propertyMap = JSONUtil.parseObj(property);
            //属性名称
            String name = propertyMap.get("name").toString();
            //属性key
            String key = propertyMap.get("key").toString();
            //属性值
            Object value1 = JSONUtil.parseObj(p).get("value");
            String value="" ;
            if(value1!=null){
                value = value1.toString();
            }

            //TODO 属性值历史数据，是否需要
            Object list = JSONUtil.parseObj(p).get("list");
            //建立属性-值映射关系
            propertiesMap.put(key,value);

        });
        propertiesMap.put("status",status.toString());
        propertiesMap.put("deviceId",deviceId);
        propertiesMap.put("realTime",time);
        return propertiesMap;
    }






    public BigDecimal toBigDecimalValue(String str) {
        if (str == null|| str.isEmpty()) {
            return null;
        }
        return new BigDecimal(str);
    }
    public Long toLongValue(String str) {
        if (str == null|| str.isEmpty()) {
            return null;
        }
        return Long.parseLong(str);
    }

}
