/**
 * 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.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Message part of Blackboard model representation.
 * @author mhorst
 *
 */
public class Message {
	
	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 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";

	public enum Action {CREATE, DELETE, UPDATE, 
		MANAGE, RELEASE, CANCEL, INIT, HALT, FEED};
	
	public enum ActionStatus {DONE, ONGOING, 
		FAILED, WAITING, ASSIGNED};
	
	private String date;
	
	private String id;
		
	private Action action;
	
	private ActionStatus actionStatus;
		
	private List<Parameter> paramList = new ArrayList<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 paramList;
	}

	public void setParamList(List<Parameter> paramList) {
		this.paramList = paramList;
	}
	
	public void addParam(Parameter param) {
		if (paramList==null)
			paramList = new ArrayList<Parameter>();
		paramList.add(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 || paramList==null)
			return null;
		Iterator<Parameter> it = paramList.iterator();
		while (it.hasNext()) {
			Parameter currentParam = it.next();
			if (name.equals(currentParam.getName()))
				return currentParam.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;
		if (paramList==null) {
			paramList = new ArrayList<Parameter>();
			paramList.add(param);
			return;
		}
		Iterator<Parameter> it = paramList.iterator();
		while (it.hasNext()) {
			Parameter currentParam = it.next();
			if (param.getName().equals(currentParam.getName())) {
				currentParam.setValue(param.getValue());
				return;
			}
		}
		paramList.add(param);
	}
	
	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"));
	}
}	
