package org.ts.ddcs.itemdatatemplate.szy;


import lombok.extern.slf4j.Slf4j;
import org.ts.ddcs.metadata.szy.SzyStatusMetadataEnum;
import org.ts.ddcs.common.util.BytesHelp;
import org.ts.ddcs.common.util.ElementJsonPackHelp;
import org.ts.ddcs.itemdatatemplate.DataItemTemplate;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * 0xF2
 * 自报 RTU测站状态
 */
@Slf4j
public class DataItemTemplateSzyRtuStatus extends DataItemTemplate {


    @Override
    public int stream(byte[] data, int index) throws UnsupportedEncodingException {
        log.info("template {}", this.getClass().getName());
        this.macth = true;
        this.intValues = new ArrayList<>();
        int count = 0;
        byte[] statusKind = BytesHelp.subBytes(data, index + count, 2);
        byte tmp = statusKind[0];
        statusKind[0] = statusKind[1];
        statusKind[1] = tmp;
        String binStr = BytesHelp.BytesToBinStr(statusKind);
        binStr = new StringBuilder(binStr).reverse().toString();
        count += 2;
        int offest = 0;
        this.intValues.add(Integer.parseInt(binStr.substring(offest, offest + 2)));
        offest += 2;
        this.intValues.add(Integer.parseInt(binStr.substring(offest, offest + 1)));
        offest += 1;
        this.intValues.add(Integer.parseInt(binStr.substring(offest, offest + 1)));
        offest += 1;
        this.intValues.add(Integer.parseInt(binStr.substring(offest, offest + 1)));
        offest += 1;
        this.intValues.add(Integer.parseInt(binStr.substring(offest, offest + 1)));
        offest += 1;
        this.intValues.add(Integer.parseInt(binStr.substring(offest, offest + 1)));
        offest += 1;
        return count;
    }

    @Override
    public int stream(byte[] data, int index, int batchSize) {
        return 0;
    }

    @Override
    public String getStringValue() {
        return null;
    }

    @Override
    public void saveValue(Map<String, List<Map<String,Object>>> keyStore) {
        List<Map<String,Object>> values = new LinkedList<>();
        for (int i = 0; i < this.intValues.size(); i++) {
            int v = this.intValues.get(i);
            if (i == 0) {
                if (v == 0x00) {
                    //终端在自报、遥测工作状态
                    values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_WORK_STATUS.getName(), "", String.valueOf(v), "", "终端在自报、遥测工作状态"));
                } else if (v == 0x01) {
                    //终端在自报确认工作状态
                    values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_WORK_STATUS.getName(), "", String.valueOf(v), "", "终端在自报确认工作状态"));
                } else if (v == 0x02) {
                    //终端在遥测工作状态
                    values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_WORK_STATUS.getName(), "", String.valueOf(v), "", "终端在遥测工作状态"));
                } else if (v == 0x03) {
                    //终端在调试或维修状态
                    values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_WORK_STATUS.getName(), "", String.valueOf(v), "", "终端在调试或维修状态"));
                }

            } else if (i == 1) {
                values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_IC_STATUS.getName(), "", String.valueOf(v), "", "终端IC卡功能是否有效"));
            } else if (i == 2) {
                values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_VALUE_STATUS.getName(), "", String.valueOf(v), "", "定值控制是否投入"));
            } else if (i == 3) {
                values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_WATER_PUMP_STATUS.getName(), "", String.valueOf(v), "", "水泵工作状态"));
            } else if (i == 4) {
                values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_DOOR_STATUS.getName(), "", String.valueOf(v), "", "终端箱门状态报警"));
            } else if (i == 5) {
                values.add(ElementJsonPackHelp.toJson(this.feture, SzyStatusMetadataEnum.METADATA_POWER_STATUS.getName(), "", String.valueOf(v), "", "电源工作状态"));
            }

        }
        keyStore.put(this.feture, values);
    }
}
