/*******************************************************************************
 * Copyright (C) 2009 The University of Manchester
 *
 *  Modifications to the initial code base are copyright of their
 *  respective authors, or their employers as appropriate.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1 of
 *  the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/
package net.sf.taverna.t2.activities.spreadsheet;

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

import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationBean;
import net.sf.taverna.t2.workflowmodel.processor.config.ConfigurationProperty;

/**
 * A range of integer values.
 *
 * @author David Withers
 */
@ConfigurationBean(uri = SpreadsheetImportActivity.URI + "/Range")
public class Range {

	/**
	 * The (inclusive) start and end of this <code>Range</code>.
	 */
	private int start, end;

	/**
	 * <code>Range</code>s that are excluded from this <code>Range</code>.
	 */
	private List<Range> excludes = new ArrayList<Range>();

	/**
	 * Constructs a <code>Range</code>.
	 */
	public Range() {
	}

	/**
	 * Constructs a <code>Range</code> with the specified start and end values.
	 *
	 * @param start
	 *            the start of the range
	 * @param end
	 *            the end of the range
	 */
	public Range(int start, int end) {
		this.start = start;
		this.end = end;
	}

	/**
	 * Constructs a <code>Range</code> with the specified start and end values and a
	 * <code>Range</code> of excluded values.
	 *
	 * @param start
	 *            the start of the range
	 * @param end
	 *            the end of the range
	 * @param exclude
	 *            the range to exclude
	 */
	public Range(int start, int end, Range exclude) {
		this.start = start;
		this.end = end;
		if (exclude != null) {
			excludes.add(exclude);
		}
	}

	/**
	 * Constructs a <code>Range</code> with the specified start and end values and
	 * <code>Range</code>s of excluded values.
	 *
	 * @param start
	 *            the start of the range
	 * @param end
	 *            the end of the range
	 * @param excludes
	 *            the ranges to exclude
	 */
	public Range(int start, int end, List<Range> excludes) {
		this.start = start;
		this.end = end;
		if (excludes != null) {
			for (Range range : excludes) {
				this.excludes.add(range);
			}
		}
	}

	/**
	 * Constructs a <code>Range</code> that is a deep copy of the specified range.
	 *
	 * @param range
	 *            the <code>Range</code> to copy
	 */
	public Range(Range range) {
		this.start = range.start;
		this.end = range.end;
		if (range.excludes != null) {
			for (Range excludeRange : range.excludes) {
				excludes.add(new Range(excludeRange));
			}
		}
	}

	/**
	 * Returns <code>true</code> if <code>value</code> is included in this <code>Range</code>.
	 *
	 * @param value
	 * @return
	 */
	public boolean contains(int value) {
		if (value >= start && (value <= end || end < 0)) {
			for (Range exclude : excludes) {
				if (exclude.contains(value)) {
					return false;
				}
			}
			return true;
		}
		return false;
	}

	/**
	 * Returns an array of the values contained in this <code>Range</code>.
	 *
	 * @return an array of the values contained in this <code>Range</code>
	 */
	public int[] getRangeValues() {
		List<Integer> rangeList = new ArrayList<Integer>();
		for (int i = start; i <= end; i++) {
			boolean excluded = false;
			for (Range range : excludes) {
				if (range.contains(i)) {
					excluded = true;
					break;
				}
			}
			if (!excluded) {
				rangeList.add(i);
			}
		}
		int[] rangeArray = new int[rangeList.size()];
		for (int i = 0; i < rangeArray.length; i++) {
			rangeArray[i] = rangeList.get(i);
		}
		return rangeArray;
	}

	/**
	 * Returns the start of the <code>Range</code>.
	 *
	 * @return the start of the <code>Range</code>
	 */
	public int getStart() {
		return start;
	}

	/**
	 * Sets the start of the <code>Range</code>.
	 *
	 * @param start
	 *            the new value for start of the <code>Range</code>
	 */
	@ConfigurationProperty(name = "start", label = "Start", description = "The start of the range")
	public void setStart(int start) {
		this.start = start;
	}

	/**
	 * Returns the end of the <code>Range</code>.
	 *
	 * @return the end of the <code>Range</code>
	 */
	public int getEnd() {
		return end;
	}

	/**
	 * Sets the end of the range.
	 *
	 * @param end
	 *            the new value for end of the <code>Range</code>
	 */
	@ConfigurationProperty(name = "end", label = "End", description = "The end of the range")
	public void setEnd(int end) {
		this.end = end;
	}

	/**
	 * Adds a <code>Range</code> to be excluded from this <code>Range</code>.
	 *
	 * @param exclude
	 *            a <code>Range</code> to be excluded
	 */
	public void addExclude(Range exclude) {
		excludes.add(exclude);
	}

	/**
	 * Removes a <code>Range</code> from the exclusions for this range.
	 *
	 * @param exclude
	 *            a <code>Range</code> to be removed from the exclusions
	 */
	public void removeExclude(Range exclude) {
		excludes.remove(exclude);
	}

	/**
	 * Returns the exclusions for this range.
	 *
	 * @return the exclusions for this range
	 */
	public List<Range> getExcludes() {
		return excludes;
	}

	/**
	 * Sets the exclusions for this range.
	 *
	 * @param excludes
	 *            the exclusions for this range
	 */
	@ConfigurationProperty(name = "excludes", label = "Excludes Ranges", description = "The ranges the exclude from this range", required = false)
	public void setExcludes(List<Range> excludes) {
		this.excludes = excludes;
	}

	@Override
	public String toString() {
		StringBuilder result = new StringBuilder();
		result.append('[');
		result.append(start);
		result.append("..");
		result.append(end);
		result.append(']');
		return result.toString();
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + end;
		result = prime * result + ((excludes == null) ? 0 : excludes.hashCode());
		result = prime * result + start;
		return result;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Range other = (Range) obj;
		if (end != other.end)
			return false;
		if (excludes == null) {
			if (other.excludes != null)
				return false;
		} else if (!excludes.equals(other.excludes))
			return false;
		if (start != other.start)
			return false;
		return true;
	}

}
