package com.szpg.plc.message.response.read;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.szpg.db.dao.PgDeviceDao;
import com.szpg.db.dao.PgHjsbblDao;
import com.szpg.db.dao.PgWsDao;
import com.szpg.db.dao.impl.PgDeviceDaoImpl;
import com.szpg.db.dao.impl.PgHjsbblDaoImpl;
import com.szpg.db.dao.impl.PgWsDaoImpl;
import com.szpg.db.data.PgHjsbbl;
import com.szpg.plc.message.response.ReadMemoryCommandResponse;
import com.szpg.plc.util.ByteUtil;
import com.szpg.util.Configure;
import com.szpg.util.TimeFormat;

public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -3778608871616106346L;

	private final Logger logger = Logger.getLogger(this.getClass().getName());

	private List<Boolean> wdbj; // 温度报警状态
	private List<Boolean> sdbj; // 湿度报警状态
	private List<Boolean> wdldbj; // 温度是否联动报警
	private List<Boolean> sdldbj; // 湿度是否联动报警
	private String[] zcList; //温湿度监测的资产列表，从配置文件中获取

	public ReadWSStatusCommandResponse() {
		wdbj = new ArrayList<Boolean>();
		sdbj = new ArrayList<Boolean>();
		wdldbj = new ArrayList<Boolean>();
		sdldbj = new ArrayList<Boolean>();
	}

	public List<Boolean> getWdbj() {
		return wdbj;
	}

	public void setWdbj(List<Boolean> wdbj) {
		this.wdbj = wdbj;
	}

	public List<Boolean> getSdbj() {
		return sdbj;
	}

	public void setSdbj(List<Boolean> sdbj) {
		this.sdbj = sdbj;
	}

	public List<Boolean> getWdldbj() {
		return wdldbj;
	}

	public void setWdldbj(List<Boolean> wdldbj) {
		this.wdldbj = wdldbj;
	}

	public List<Boolean> getSdldbj() {
		return sdldbj;
	}

	public void setSdldbj(List<Boolean> sdldbj) {
		this.sdldbj = sdldbj;
	}
	
	public String[] getZcList() {
		return zcList;
	}

	public void setZcList(String[] zcList) {
		this.zcList = zcList;
	}

	@Override
	public void afterAction() {
		// 1将温湿度报警状态存入数据库
		PgWsDao wsDao = new PgWsDaoImpl();
		PgDeviceDao deviceDao = new PgDeviceDaoImpl();
		
		// 遍历资产列表，将温湿度报警状态存入数据库
		for (int i = 0; i < zcList.length; i++) {
			String zcbh = zcList[i];
			
			int id = deviceDao.findDeviceIdByCode(zcbh);
			if (id > 0) {
				wsDao.addWsdbjRecord(wdbj.get(i), sdbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id);
			}
		}
	}

	@Override
	public void parseData(byte[] messageData) {
		// 获取目标ACU的代码
		String acucode = this.getAcucode();
		
		// 判断数据的长度是否满足要求
		if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WSALM.WORDCOUNT")) * 2) {
			logger.error("返回的数据长度与读取的不一致！");
			this.setValid(false);
			return;
		}
		
		// 将数据转换为字符串
		// 按照高字在前，低字在后；高字节在前，低字节在后的顺序
		String dataStr = "";
		for (int c = 0; c < messageData.length; c = c + 2) {
			dataStr = ByteUtil.binToBinString(new byte[] {messageData[c], messageData[c + 1]}) + dataStr;
		}
		
		PgHjsbblDao blDao = new PgHjsbblDaoImpl();
		
		// 获取目标ACU温湿度监测值内存区域的起始字地址
		int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WSALM.START"));
		
		// 获取目标ACU温湿度相关的资产列表，即温湿度设备列表
		String zcListStr = Configure.getProperty("acubl", acucode + ".WS.ZC.LIST");
		if (StringUtils.isEmpty(zcListStr) == true) {
			this.setValid(false);
			return;
		}
		zcList = zcListStr.split(";");
		
		// 解析温湿度报警状态
		for (int i = 0; i < zcList.length; i++) {
			String zcbh = zcList[i];
			
			// 1解析温度报警值
			PgHjsbbl almBlTemObj = blDao.findBlByBh(zcbh + ".TemAH");
			if (null == almBlTemObj) {
				continue;
			}
			
			int awkszdz = almBlTemObj.getKszdz(); //开始字地址
			int awoffset = awkszdz - start; //与开始字的偏移量
			int awbit = almBlTemObj.getSzw(); //所在位
			
			char bjTemBt = dataStr.charAt(dataStr.length() - 1 - awoffset * 16 - awbit); // 温度报警状态标志位
			
			// 2解析温度浓度报警联动标志位
			PgHjsbbl enBlObj = blDao.findBlByBh(zcbh + ".TemEN");
			if (null == enBlObj) {
				continue;
			}
			
			int ewkszdz = enBlObj.getKszdz(); //开始字地址
			int ewoffset = ewkszdz - start; //与开始字的偏移量
			int ewbit = enBlObj.getSzw(); //所在位
			
			char enTemBt = dataStr.charAt(dataStr.length() - 1 - ewoffset * 16 - ewbit); // 温度联动报警使能标志位
			
			// 3解析湿度报警值
			PgHjsbbl almBlWetObj = blDao.findBlByBh(zcbh + ".WetAH");
			if (null == almBlWetObj) {
				continue;
			}
			
			int askszdz = almBlWetObj.getKszdz(); //开始字地址
			int asoffset = askszdz - start; //与开始字的偏移量
			int asbit = almBlWetObj.getSzw(); //所在位
			
			char bjWetBt = dataStr.charAt(dataStr.length() - 1 - asoffset * 16 - asbit); // 湿度报警状态标志位
			
			// 4解析湿度报警联动标志位
			PgHjsbbl enBlWetObj = blDao.findBlByBh(zcbh + ".WetEN");
			if (null == enBlWetObj) {
				continue;
			}
			
			int eskszdz = enBlWetObj.getKszdz(); //开始字地址
			int esoffset = eskszdz - start; //与开始字的偏移量
			int esbit = enBlWetObj.getSzw(); //所在位
			
			char enWetBt = dataStr.charAt(dataStr.length() - 1 - esoffset * 16 - esbit); // 温湿度浓度联动报警使能标志位
			
			getWdbj().add(bjTemBt == '1' ? true : false);
			getSdbj().add(bjWetBt == '1' ? true : false);
			getWdldbj().add(enTemBt == '1' ? true : false);
			getSdldbj().add(enWetBt == '1' ? true : false);
		}
	}

}
