package com.huimv.eartag.listener;

import com.alibaba.fastjson.JSONObject;

import com.huimv.eartag.utils.Const;
import com.huimv.eartag.utils.MathUtil;
import com.huimv.eartag.service.IDeviceService;
import com.huimv.eartag.service.IEartagService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

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

/**
 * @Project : huimv.shiwan
 * @Package : com.huimv.biosafety.uface.controller
 * @Description : TODO
 * @Version : 1.0
 * @Author : ZhuoNing
 * @Create : 2020-12-25
 **/
@Component
@Slf4j
public class EartagListener {


    @Autowired
    private IDeviceService deviceService;
    @Autowired
    private IEartagService eartagService;

    /**
     * @Method      : processRawdata
     * @Description :
     * @Params      : [RawMap]
     * @Return      : void
     *
     * @Author      : ZhuoNing
     * @Date        : 2022/3/12
     * @Time        : 17:53
     */
    @RabbitListener(queues = Const.QUEUE_ASK_EARTAG)
    @RabbitHandler
    public void processRawdata(Map RawMap) throws ParseException {
        System.out.println("<<<<<<<<<<<<<<< RawMap>>"+RawMap.toString());
        String askText = RawMap.get("askText").toString();
        System.out.println("<<<<<<<<<<<<<<<<<<<<<<< 处理耳标 <<<<<<<<<<<<<<<<<<<<<<<");
        //本模块主要执行保存以下4类数据：（其他注册数据，在线数据，状态数据等都是由其他模块工程执行处理-process2模块工程）
        //--保存原始流水数据（原始流水表）
        //--保存设备心跳流水数据（设备心跳流水表）
        //--保存设备环境流水数据（设备温度流水表）
        //--保存耳标流水数据（耳标流水表）

        //{处理请求报文}
        Map askMap = handleAskText(askText);
        String type = askMap.get("type").toString();
        JSONObject dataJo = (JSONObject) askMap.get("data");
        System.out.println("## dataJo>>"+dataJo);
        //
        String earmark = dataJo.getString("earmark");
        System.out.println("earmark>>"+earmark);
        //测试代码(属于测试耳标才能进行测试)
        if(checkTestRange(earmark)){
            if(type.trim().equalsIgnoreCase("eartag")){
                //{处理耳标数据}
                eartagService.handleEartag(dataJo);
            }
        }else{
            System.out.println("## 已过滤非测试耳标");
        }
//        //正式代码
//        if(type.trim().equalsIgnoreCase("eartag")){
//            System.out.println("askText>>"+askText);
//            //{处理耳标数据}
//            eartagService.handleEartag(dataJo);
//        }
    }

    private boolean checkTestRange(String earmark) {
        Long c = Long.parseLong(earmark);
        Long a = 122083123610001L;
        Long b = 122083123610100L;
        return (c>=a && c<b) || (c>a && c<=b);
    }

    /**
     * @Method      : handleAskText
     * @Description : 处理请求
     * @Params      : [askText]
     * @Return      : java.util.Map
     *
     * @Author      : ZhuoNing
     * @Date        : 2022/2/9
     * @Time        : 13:38
     */
    private Map handleAskText(String askText) {
        Map outMap = new HashMap();
        JSONObject dataJo = new JSONObject();
        String type = "";
        String[] dataArray = askText.split("\\+");
        String cmdHeader = dataArray[0];
        if (cmdHeader.trim().equalsIgnoreCase("hm")) {
            //采集器原始数据
            String device = dataArray[1];
            String cmd = dataArray[2];
            if (cmd.trim().equalsIgnoreCase("0")) {
                //不需要处理
            } else if (cmd.trim().equalsIgnoreCase("1")) {
                //获取设备编码
            } else if (cmd.trim().equalsIgnoreCase("2")) {
                //获取服务器时间命令
            } else if (cmd.trim().equalsIgnoreCase("3")) {
                //心跳包命令
                dataJo.put("device", device);
                type = "device-heartbeat";
            } else if (cmd.trim().equalsIgnoreCase("4")) {
                //环境温度-设备、数值、上传时间
                dataJo.put("device", dataArray[1]);
                dataJo.put("temp", dataArray[4]);
                dataJo.put("askTime", dataArray[5]);
                type = "device-temp";
            } else {
                log.error("##当前数据为非法数据>>" + askText);
            }
        } else if (cmdHeader.trim().equalsIgnoreCase("zj")) {
//            String device = dataArray[1];
            //-- 耳标数据 --//
            //计算耳标温度
            Double earTemp = 0D;
            String other = dataArray[9];
            if (other != null && other.trim().length() > 0) {
                String[] otherArray = other.split("#");
                String resi = otherArray[2];
                int resiInt = Integer.parseInt(resi);
                if(resiInt != 0){
                    Double temp = MathUtil.ln(resiInt);
                    earTemp = new BigDecimal(temp).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
                }
            }
            //计算运动量//
            Integer act1Int = eartagService.countEartagAct(dataArray[2], dataArray[6]);

            //命令头
            dataJo.put("cmdHeader", dataArray[0]);
            //采集器id
            dataJo.put("device", dataArray[1]);
            //耳标号
            dataJo.put("earmark", dataArray[2]);
            //电池电量
            dataJo.put("bat", dataArray[3]);
            //耳标温度
            dataJo.put("earTemp", dataArray[4]);
            dataJo.put("earTemp1", earTemp);
            //环境温度
            dataJo.put("envTemp", dataArray[5]);
            dataJo.put("envTemp1", MathUtil.countEnvtemp(dataArray[5],2));
//            dataJo.put("envTemp1", 0);
            //运动量
            dataJo.put("act", dataArray[6]);
            dataJo.put("act1", act1Int);
            //信号强度
            dataJo.put("signal", dataArray[7]);
            //采集时间
            dataJo.put("askTime", dataArray[8]);
            //预留字段
            dataJo.put("other", dataArray[9]);
            type = "eartag";
        }
        outMap.put("type",type);
        outMap.put("data",dataJo);
        return outMap;
    }




}
