package com.tandbergtv.metadatamanager.model;


/**
 * Model for storing the revisions of metadata fields . Stores the xpath for the
 * field in the ttvspec format. indices is used to group complex types
 * 
 * @author cmao
 * 
 */
public class FieldRevision extends FieldBase implements IField {

	// Revision related
	private int revisionNumber;
	private int addRevision;
	private int deleteRevision;

	public FieldRevision() {
		super();
		init(NextRevision.STARTING_REVISION_NUMBER);
	}

	protected void init(int addRevisionNum) {
		this.revisionNumber = addRevisionNum;
		this.addRevision = addRevisionNum;
		this.deleteRevision = NextRevision.NULL_REVISION_NUMBER;
	}

	/**
	 * Ctor
	 * 
	 * @param ttvXPath
	 * @param value
	 */
	public FieldRevision(String ttvXPath, String value) {
		super(ttvXPath, value);
	}

	public FieldRevision(IField copyFromField, NextRevision nextRevision) {
		this.setTtvXPath(copyFromField.getTtvXPath());
		if (copyFromField.getDataType() != null) {
			this.dataType = copyFromField.getDataType();
		}
		this.setValue(copyFromField.getValue());
		this.setIndices(copyFromField.getIndices());
		if (copyFromField.getRoot() != null) {
			this.setRoot(copyFromField.getRoot());
		}
		if (copyFromField.getParentAsset() != null) {
			this.setParentAsset(copyFromField.getParentAsset());
		}

		if (copyFromField instanceof FieldRevision) {
			this.setRevisionNumber(nextRevision.getRevisionNumber());
			this.setAddRevision(((FieldRevision) copyFromField)
					.getAddRevision());
			this.setDeleteRevision(((FieldRevision) copyFromField)
					.getDeleteRevision());
		} else {
			init(nextRevision.getRevisionNumber());
		}
	}

	@Override
	public String toString() {
		return "[" + id + "] (" + getAddRevision() + "," + getDeleteRevision()
				+ "," + getRevisionNumber() + ")" + getTtvXPath() + ", "
				+ getValue() + "," + getStoredIndices();
	}

	public int getRevisionNumber() {
		return revisionNumber;
	}

	public void setRevisionNumber(int revisionNumber) {
		this.revisionNumber = revisionNumber;
	}

	public int getAddRevision() {
		return addRevision;
	}

	public void setAddRevision(int addRevision) {
		this.addRevision = addRevision;
	}

	public int getDeleteRevision() {
		return deleteRevision;
	}

	public void setDeleteRevision(int deleteRevision) {
		this.deleteRevision = deleteRevision;
	}

}
