/**
 * Copyright 2008-2009 DRIVER PROJECT (Bielefeld University)
 * Original author: Marek Horst (ICM UW)
 *
 * 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;

import eu.dnetlib.common.interfaces.nh.IBlackboardMessage;

/**
 * Message part of Blackboard model representation.
 * @author Marek Horst
 * @version 0.0.1  
 *
 */
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;
	}




}	
