/**
 * Copyright 2008-2009 DRIVER PROJECT (ICM UW)
 * Original author: Marek Horst
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package eu.dnetlib.common.profile.blackboard;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * Message part of Blackboard model representation.
 * @author mhorst
 *
 */
public class Message implements IBlackboardMessage{
	
	public static final String CREATE	= "CREATE";
	public static final String DELETE	= "DELETE";
	public static final String UPDATE	= "UPDATE";
	public static final String MANAGE	= "MANAGE";
	public static final String RELEASE	= "RELEASE";
	public static final String STORE 	= "STORE";
	public static final String CANCEL	= "CANCEL";
	public static final String INIT		= "INIT";
	public static final String HALT		= "HALT";
	public static final String FEED		= "FEED";
	
	public static final String DONE		= "DONE";
	public static final String ONGOING	= "ONGOING";
	public static final String FAILED	= "FAILED";
	public static final String WAITING	= "WAITING";
	public static final String ASSIGNED	= "ASSIGNED";


	
	private String date;
	
	private String id;
		
	private Action action;
	
	private ActionStatus actionStatus;
		
	private Map<String, Parameter> bbParamMap = new LinkedHashMap<String, Parameter>();

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Action getAction() {
		return action;
	}

	public void setAction(Action action) {
		this.action = action;
	}

	public ActionStatus getActionStatus() {
		return actionStatus;
	}

	public void setActionStatus(ActionStatus actionStatus) {
		this.actionStatus = actionStatus;
	}
	
	public List<Parameter> getParamList() {
		return new LinkedList<Parameter>(bbParamMap.values());
	}

	public void setParamList(List<Parameter> paramList) {
		if (paramList != null)
			for (Parameter param: paramList)
				bbParamMap.put(param.getName(), param);
	}
	
	public void addParam(Parameter param) {
		bbParamMap.put(param.getName(), param);
	}
	
	/**
	 * Returns first parameter value for the given param name.
	 * @param name
	 * @return first parameter value for the given param name
	 */
	public String getParameter(String name) {
		if (name==null || bbParamMap==null)
			return null;
		if (bbParamMap.containsKey(name)) 
			return bbParamMap.get(name).getValue();
		return null;
	}
	
	/**
	 * Overwrites existing parameter or adds new param if name non existing.
	 * @param param
	 */
	public void overwriteParameter(Parameter param) {
		if (param==null || param.getName()==null)
			return;
		bbParamMap.put(param.getName(), param);
	}
	
	public boolean containsParameter(String name) {
		return bbParamMap.containsKey(name);
	}

	public void setParameters(Map<String, String> parameters) {
		for (String name: parameters.keySet()){
			bbParamMap.put(name, new Parameter(name, parameters.get(name)));
		}
		
	}
	
	public Map<String, Parameter> getParamMap() {
		return bbParamMap;
	}
	
	public static void main(String[] args) {
		Message message = new Message();
		message.overwriteParameter(new Parameter("someName", "someValue"));
		message.overwriteParameter(new Parameter("someName", "someValue2"));
		System.out.println(message.getParameter("someName"));
	}
}	
