package com.artfess.base.model;

import com.artfess.base.util.BeanUtils;
import com.artfess.base.util.JsonUtil;
import com.artfess.base.util.StringUtil;
import org.springframework.util.Assert;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;


public class HtObjectNode extends ObjectNode {
	private static final long serialVersionUID = 1L;
	
	public HtObjectNode(HtJsonNodeFactory nc) {
		super(nc);
	}

	public HtObjectNode(HtJsonNodeFactory nc, ObjectNode objectNode) {
		this(nc);
		this.setAll(objectNode);
	}

	public String getString(String key) {
		return this.getString(key, "");
	}

	public String getString(String key, String defaultVal) {
		Assert.isTrue(StringUtil.isNotEmpty(key), "key不能为空");
		JsonNode jsonNode = super.get(key);
		if (jsonNode == null) {
			return defaultVal;
		}
		return jsonNode.asText();
	}

	public Integer getInt(String key, Integer defaultVal) {
		Assert.isTrue(StringUtil.isNotEmpty(key), "key不能为空");
		JsonNode jsonNode = super.get(key);
		if (jsonNode == null) {
			return defaultVal;
		}
		return jsonNode.asInt();
	}

	public Integer getInt(String fieldName) {
		return getInt(fieldName, null);
	}

	public Double getDouble(String key, Double defaultVal) {
		Assert.isTrue(StringUtil.isNotEmpty(key), "key不能为空");
		JsonNode jsonNode = super.get(key);
		if (jsonNode == null) {
			return defaultVal;
		}
		return jsonNode.asDouble();
	}

	public Double getDouble(String key) {
		return getDouble(key, null);
	}

	public Boolean getBoolean(String fieldName, Boolean defaultValue) {
		Assert.isTrue(StringUtil.isNotEmpty(fieldName), "key不能为空");
		JsonNode jsonNode = super.get(fieldName);
		if (jsonNode == null || !jsonNode.isBoolean()) {
			return defaultValue;
		}
		return jsonNode.asBoolean();
	}

	public Boolean getBoolean(String fieldName) {
		return getBoolean(fieldName, false);
	}

	public Long getLong(String fieldName, Long defaultValue) {
		Assert.isTrue(StringUtil.isNotEmpty(fieldName), "key不能为空");
		JsonNode jsonNode = super.get(fieldName);
		if (jsonNode == null || !jsonNode.isLong()) {
			return defaultValue;
		}
		return jsonNode.asLong();
	}

	public Long getLong(String fieldName) {
		return getLong(fieldName, null);
	}

	public ArrayNode getSubTableData(String subTableName) {
		ArrayNode arrayNode = JsonUtil.getMapper().createArrayNode();
		if (super.hasNonNull("subMap")) {
			ObjectNode subMap = (ObjectNode) super.get("subMap");
			if (subMap.hasNonNull(subTableName)) {
				arrayNode = (ArrayNode) subMap.get(subTableName);
			}
		}
		return arrayNode;
	}

	/**
	 * 设置bodata子表的值。
	 * @param subTableName
	 * @param filedName
	 * @param value
	 */
	public void setSubFiledVal(String subTableName, String filedName, Object value) {
		ArrayNode subDatas =getSubTableData(subTableName);
		for (JsonNode sub : subDatas) {
			ObjectNode sNode = (ObjectNode) sub;
			if(BeanUtils.isNotEmpty(sNode) && sNode.has("data")) {
				sNode = (ObjectNode) sNode.get("data");
			}
			JsonUtil.putObjectToJson(sNode, filedName, value);
		}
	}
	/**
	 * 设置bodata子表的值。
	 * @param subTableName
	 * @param filedName
	 * @param value
	 * @param index
	 */
	public void setSubFiledVal(String subTableName, String filedName, Object value, int index) {
		ArrayNode subDatas = getSubTableData(subTableName);
		if (subDatas.size() <= index) {
			return;
		}
		ObjectNode sNode = (ObjectNode) subDatas.get(index);
		if(BeanUtils.isNotEmpty(sNode) && sNode.has("data")) {
			sNode = (ObjectNode) sNode.get("data");
		}
		JsonUtil.putObjectToJson(sNode, filedName, value);
	}
	
	public void setSunFiledVal(String subTableName,String sunTableName ,String filedName, Object value) {
		ArrayNode subDatas = getSubTableData(subTableName);
		if (subDatas.size() <= 0) {
			return;
		}
		for (int i = 0; i < subDatas.size(); i++) {
			ObjectNode sNode = (ObjectNode) subDatas.get(i);
			String sunName = "sub_"+sunTableName;
			if(sNode.has(sunName)){
				ArrayNode sunArray = (ArrayNode) sNode.get("sub_"+sunTableName);
				if(sunArray.size() > 0){
					for (int j = 0; j < sunArray.size(); j++) {
						ObjectNode sunNode = (ObjectNode) sunArray.get(j);
						if(BeanUtils.isNotEmpty(sunNode) && sunNode.has("data")) {
							sunNode = (ObjectNode) sunNode.get("data");
						}
						JsonUtil.putObjectToJson(sunNode, filedName, value);
					}
					JsonUtil.putObjectToJson(sNode, sunName, sunArray);
				}
			}
		}
	}
	
	
	public void setSunFiledVal(String subTableName,String sunTableName ,String filedName, Object value, int subIndex) {
		ArrayNode subDatas = getSubTableData(subTableName);
		if (subDatas.size() <= subIndex) {
			return;
		}
		ObjectNode sNode = (ObjectNode) subDatas.get(subIndex);
		String sunName = "sub_"+sunTableName;
		if(sNode.has(sunName)){
			ArrayNode sunArray = (ArrayNode) sNode.get("sub_"+sunTableName);
			if(sunArray.size() > 0){
				for (int j = 0; j < sunArray.size(); j++) {
					ObjectNode sunNode = (ObjectNode) sunArray.get(j);
					if(BeanUtils.isNotEmpty(sunNode) && sunNode.has("data")) {
						sunNode = (ObjectNode) sunNode.get("data");
					}
					JsonUtil.putObjectToJson(sunNode, filedName, value);
				}
				JsonUtil.putObjectToJson(sNode, sunName, sunArray);
			}
		}
	}
	
	/**
	 * 设置bodata子表的值。
	 * @param subTableName
	 * @param filedName
	 * @param value
	 * @param sunIndex
	 */
	public void setSunFiledVal(String subTableName,String sunTableName ,String filedName, Object value, int subIndex,int sunIndex) {
		ArrayNode subDatas = getSubTableData(subTableName);
		if (subDatas.size() <= subIndex) {
			return;
		}
		ObjectNode sNode = (ObjectNode) subDatas.get(subIndex);
		String sunName = "sub_"+sunTableName;
		if(sNode.has(sunName)){
			ArrayNode sunArray = (ArrayNode) sNode.get("sub_"+sunTableName);
			if(sunArray.size() > sunIndex){
				ObjectNode sunNode = (ObjectNode) sunArray.get(sunIndex);
				if(BeanUtils.isNotEmpty(sunNode) && sunNode.has("data")) {
					sunNode = (ObjectNode) sunNode.get("data");
				}
				JsonUtil.putObjectToJson(sunNode, filedName, value);
				JsonUtil.putObjectToJson(sNode, sunName, sunArray);
			}
		}
	}
}
