package com.leanwo.activiti.dto.base;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据模型.
 *
 * @author ZhiJie
 */
public class ModelData implements Serializable {
	
	/**  */
	private Long id;
	
	/**  */
	private Map<String, FieldValue> data = new HashMap<String, FieldValue>();
	
	/**  数据已改变. */
	private boolean changed;

	/**  数据对应的窗口编号. */
	private String windowNo;
	
	/**  数据对应的页签编号. */
	private Integer tabIndex;
	
	/**  对应的子页签数据. */
	private List<ModelData> saveDatas;
	
	/** 树的子节点数据. */
	private List<ModelData> childrenDatas;
	
	/**
	 * 
	 *
	 * @return 
	 */
	public Map<String, FieldValue> getData() {
		return data;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#clone()
	 */
	public ModelData clone(){
		ModelData modelData = new ModelData();
		for(String key : data.keySet()){
			if(data.get(key) != null){
				modelData.getData().put(key, data.get(key).clone());
			}
		}
		modelData.setChanged(isChanged());
		modelData.setTabIndex(getTabIndex());
		modelData.setWindowNo(getWindowNo());
		modelData.setId(getId());
		return modelData;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof ModelData){
			ModelData data = (ModelData)obj;			
			return equals(data) && data.equals(this);
		}
		return false;
	}
	
	/**
	 * 
	 *
	 * @param compareData 
	 * @return 
	 */
	public boolean equals(ModelData compareData){
		if(compareData == null)
			return false;
		
		if(compareData.getId() == null || id == null || compareData.getId().equals(id) == false){
			return false;
		}
		
		for(String key : compareData.getData().keySet()){
			FieldValue value1 = this.getData().get(key);
			if(value1 != null && value1.isNull()){
				value1 = null;
			}
			FieldValue value2 = compareData.getData().get(key);
			if(value2 != null && value2.isNull()){
				value2 = null;
			}
			if(value1 == null && value2 == null)
				continue;
			if(value1 == null && value2 != null)
				return false;
			if(value1 != null && value2 == null)
				return false;
			if(value1.equals(value2) == false)
				return false;
		}
		return true;
	}
	
	/**
	 * 
	 *
	 * @return 
	 */
	public Long getId() {
		return id;
	}

	/**
	 * 
	 *
	 * @param id 
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * Checks if is 数据已改变.
	 *
	 * @return the 数据已改变
	 */
	public boolean isChanged() {
		return changed;
	}

	/**
	 * Sets the 数据已改变.
	 *
	 * @param changed the new 数据已改变
	 */
	public void setChanged(boolean changed) {
		this.changed = changed;
	}
	
	/**
	 * Gets the 数据对应的窗口编号.
	 *
	 * @return the 数据对应的窗口编号
	 */
	public String getWindowNo() {
		return windowNo;
	}

	/**
	 * Sets the 数据对应的窗口编号.
	 *
	 * @param windowNo the new 数据对应的窗口编号
	 */
	public void setWindowNo(String windowNo) {
		this.windowNo = windowNo;
	}

	/**
	 * Gets the 数据对应的页签编号.
	 *
	 * @return the 数据对应的页签编号
	 */
	public Integer getTabIndex() {
		return tabIndex;
	}

	/**
	 * Sets the 数据对应的页签编号.
	 *
	 * @param tabNo the new 数据对应的页签编号
	 */
	public void setTabIndex(Integer tabIndex) {
		this.tabIndex = tabIndex;
	}

	/**
	 * Gets the 对应的子页签数据.
	 *
	 * @return the 对应的子页签数据
	 */
	public List<ModelData> getSaveDatas() {
		return saveDatas;
	}
	
	/**
	 * Sets the 对应的子页签数据.
	 *
	 * @param saveDatas the new 对应的子页签数据
	 */
	public void setSaveDatas(List<ModelData> saveDatas) {
		this.saveDatas = saveDatas;
	}

	/**
	 * Gets the 树的子节点数据.
	 *
	 * @return the 树的子节点数据
	 */
	public List<ModelData> getChildrenDatas() {
		return childrenDatas;
	}
	
	/**
	 * Sets the 树的子节点数据.
	 *
	 * @param childrenDatas the new 树的子节点数据
	 */
	public void setChildrenDatas(List<ModelData> childrenDatas) {
		this.childrenDatas = childrenDatas;
	}
	

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append("id=").append(id);
		if(data != null && data.size() != 0){
			for(String key : data.keySet()){
				sb.append("(").append(key).append("=").append(data.get(key)).append("),");
			}
		}
		return sb.toString();
	}

	/**
	 * 
	 *
	 * @param data 
	 */
	public void setData(Map<String, FieldValue> data) {
		this.data = data;
	}
	
	/**
	 * 获取字段的显示值
	 * @param fieldName 字段名称
	 * @return
	 */
	public String getFieldDisplayValue0(String fieldName) {
		if(this.data == null) {
			return null;
		}
		FieldValue fieldValue = this.data.get(fieldName);
		if(fieldValue== null) {
			return null;
		}
		String[] displayValues = fieldValue.getDisplayValue();
		if(displayValues == null || displayValues.length == 0) {
			return null;
		}
		return displayValues[0];
	}
	
	/**
	 * 获取字段的显示值
	 * @param fieldName 字段名称
	 * @return
	 */
	public Double getFieldDisplayValue0Double(String fieldName) {
		String value = getFieldDisplayValue0(fieldName);
		if(value == null) {
			return null;
		}
		return new Double(value);
	}
	
}
