/*******************************************************************************
 * Copyright (c) 2011 Tasktop Technologies and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.tasks.core.data;

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

import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.tasks.core.IRepositoryPerson;

/**
 * Describes a revision of a task in its history.
 * 
 * @author Steffen Pingel
 * @since 3.6
 */
public class TaskRevision {

	/**
	 * @author Steffen Pingel
	 */
	public static class Change {

		private final String added;

		private final String attributeId;

		private final String field;

		private final String removed;

		/**
		 * Constructs a field change.
		 * 
		 * @param attributeId
		 *            the id of the attribute that has changed, must not be null
		 * @param field
		 *            the label of the attribute that has changed, must not be null
		 * @param removed
		 *            the values that were removed
		 * @param added
		 *            the values that were added
		 */
		public Change(String attributeId, String field, String removed, String added) {
			Assert.isNotNull(attributeId);
			Assert.isNotNull(field);
			this.attributeId = attributeId;
			this.field = field;
			this.removed = removed;
			this.added = added;
		}

		public String getAdded() {
			return added;
		}

		public String getAttributeId() {
			return attributeId;
		}

		public String getField() {
			return field;
		}

		public String getRemoved() {
			return removed;
		}

	}

	private final IRepositoryPerson author;

	private final List<TaskRevision.Change> changes;

	private final Date date;

	private final String id;

	/**
	 * @param id
	 *            id that identifies the revisions, it must be unique on a per task basis
	 * @param date
	 *            the time the revision was created
	 * @param author
	 *            the person that made changes for this revision
	 */
	public TaskRevision(String id, Date date, IRepositoryPerson author) {
		Assert.isNotNull(id);
		this.id = id;
		this.date = date;
		this.author = author;
		this.changes = new ArrayList<TaskRevision.Change>();
	}

	public void add(TaskRevision.Change change) {
		changes.add(change);
	}

	public IRepositoryPerson getAuthor() {
		return author;
	}

	public List<TaskRevision.Change> getChanges() {
		return new ArrayList<TaskRevision.Change>(changes);
	}

	public Date getDate() {
		return date;
	}

	public String getId() {
		return id;
	}

	public void remove(TaskRevision.Change change) {
		changes.remove(change);
	}

}