package eu.dnetlib.r2d2.neo4j.events;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import eu.dnetlib.r2d2.neo4j.Neo4jBean;

public class BeanUpdateEvent {
	private Class<? extends Neo4jBean> beanClass = null;
	private String beanId = null;
	private Date eventDate = null;
	private List<UpdatedProperty> updatedProperties = new ArrayList<UpdatedProperty>();

	public BeanUpdateEvent(Class<? extends Neo4jBean> beanClass, String beanId, Date eventDate) {
		this.beanClass = beanClass;
		this.beanId = beanId;
		this.eventDate = eventDate;
	}

	public Class<? extends Neo4jBean> getBeanClass() {
		return beanClass;
	}

	public void setBeanClass(Class<? extends Neo4jBean> beanClass) {
		this.beanClass = beanClass;
	}

	public String getBeanId() {
		return beanId;
	}

	public void setBeanId(String beanId) {
		this.beanId = beanId;
	}

	public Date getEventDate() {
		return eventDate;
	}

	public void setEventDate(Date eventDate) {
		this.eventDate = eventDate;
	}

	public List<UpdatedProperty> getUpdatedProperties() {
		return updatedProperties;
	}

	public void setUpdatedProperties(List<UpdatedProperty> updatedProperties) {
		this.updatedProperties = updatedProperties;
	}

	public void addUpdatedProperty(String propertyName, Object previousValue,
			Object newValue) {
		this.updatedProperties.add(new UpdatedProperty(propertyName, previousValue, newValue));
	}
	
	public String toString() {
		StringBuilder builder = new StringBuilder();
		
		builder.append("[").append(eventDate);
		builder.append("] [UPDATE] beanId: '").append(beanId).append("'. Properties: ");
		
		for (UpdatedProperty prop:this.updatedProperties)
			builder.append(prop.toString()).append(" ,");
		
		return builder.toString();
	}

	class UpdatedProperty {
		private String propertyName = null;
		private Object previousValue = null;
		private Object newValue = null;

		public UpdatedProperty(String propertyName, Object previousValue,
				Object newValue) {
			this.propertyName = propertyName;
			this.previousValue = previousValue;
			this.newValue = newValue;
		}

		public String getPropertyName() {
			return propertyName;
		}

		public void setPropertyName(String propertyName) {
			this.propertyName = propertyName;
		}

		public Object getPreviousValue() {
			return previousValue;
		}

		public void setPreviousValue(Object previousValue) {
			this.previousValue = previousValue;
		}

		public Object getNewValue() {
			return newValue;
		}

		public void setNewValue(Object newValue) {
			this.newValue = newValue;
		}
		
		public String toString() {
			StringBuilder builder = new StringBuilder();
			
			builder.append("(Property name: ").append(propertyName);
			builder.append(", previous value: '").append(previousValue);
			builder.append("'. new value: '").append(newValue).append("'.)");
			
			return builder.toString();
		}
	}
}
