package eu.dnetlib.contract.builder;

import javax.xml.ws.wsaddressing.W3CEndpointReference;
import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;

import sun.misc.BASE64Encoder;
import eu.dnetlib.common.profile.ProfileHeader;
import eu.dnetlib.common.profile.blackboard.Blackboard;
import eu.dnetlib.common.profile.blackboard.BlackboardLastAction;
import eu.dnetlib.common.profile.blackboard.Message;
import eu.dnetlib.common.profile.blackboard.Parameter;
import eu.dnetlib.common.profile.blackboard.IBlackboardMessage.Action;
import eu.dnetlib.common.profile.blackboard.IBlackboardMessage.ActionStatus;
import eu.dnetlib.common.profile.utils.ProfileMarshaller;
import eu.dnetlib.data.information.similarity.SimilarityServiceConstants;
import eu.dnetlib.miscutils.datetime.DateUtils;

/**
 * BB message builder module.
 * 
 * @author mhorst
 *
 */
public class BlackBoardMessageBuilder {

	protected final static String DEFAULT_ADDRESS = "http://localhost/resultSet";
	
	private String address = DEFAULT_ADDRESS;
	
	/**
	 * Builds blackboard CREATE message.
	 * @return CREATE message string representation
	 */
	public String buildCreateMessage() {
		return buildGenericMessage(Action.CREATE);
	}
	
	/**
	 * Builds blackboard CREATE message.
	 * @return CREATE message string representation
	 */
	public String buildDeleteMessage() {
		return buildGenericMessage(Action.DELETE);
	}
	
	/**
	 * Builds blackboard FEED message.
	 * @return FEED message string representation
	 */
	public String buildFeedMessage() {
		return buildGenericMessage(Action.FEED, new Parameter(
				Parameter.PARAM_NAME_RESULTSET_EPR,	getDummyEPRContent()));
	}
	
	protected String buildGenericMessage(Action action, Parameter... params) {
		ProfileHeader profileHeader = new ProfileHeader("someProfId",
				SimilarityServiceConstants.SIMILARITY_SERVICE_RESOURCE_TYPE,
				"ServiceResources");
		Blackboard blackboard = new Blackboard();
		String lastMessageId = "someMessageId";
		String date = DateUtils.now_ISO8601();
		Message message = new Message();
		message.setId(lastMessageId);
		message.setDate(date);
		message.setAction(action);
		message.setActionStatus(ActionStatus.ASSIGNED);
		if (params!=null) {
			for (Parameter param : params) {
				message.addParam(param);
			}
		}
		blackboard.addMessage(message);
		blackboard.setLastRequest(new BlackboardLastAction(
				date ,lastMessageId));
		return ProfileMarshaller.generateBBProfile(
				profileHeader, blackboard);
	}
	
	protected String getDummyEPRContent() {
		W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
		builder.address(address);
		W3CEndpointReference epr = builder.build();
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(epr.toString().getBytes());
	}

	public void setAddress(String address) {
		this.address = address;
	}
}
