/*******************************************************************************
 * 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.HashMap;
import java.util.Map;
import java.util.Set;

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

/**
 * Configuration for the SpreadsheetImport activity.
 *
 * @author David Withers
 */
@ConfigurationBean(uri = SpreadsheetImportActivity.URI + "#Config")
public class SpreadsheetImportConfiguration {

	private Range columnRange;
	private Range rowRange;
	private String emptyCellValue;
	private Map<String, String> columnNames;
	private boolean allRows;
	private boolean excludeFirstRow;
	private boolean ignoreBlankRows;
	private SpreadsheetEmptyCellPolicy emptyCellPolicy;
	private SpreadsheetOutputFormat outputFormat;
	private String csvDelimiter;

	/**
	 * Constructs a new SpreadsheetImportConfiguration.
	 */
	public SpreadsheetImportConfiguration() {
		columnRange = new Range(0, 1);
		rowRange = new Range(0, -1);
		emptyCellValue = "";
		columnNames = new HashMap<String, String>();
		allRows = true;
		excludeFirstRow = false;
		ignoreBlankRows = false;
		emptyCellPolicy = SpreadsheetEmptyCellPolicy.EMPTY_STRING;
		outputFormat = SpreadsheetOutputFormat.PORT_PER_COLUMN;
		csvDelimiter = ",";
	}

	/**
	 * Constructs a new SpreadsheetImportConfiguration that copies the values from the given
	 * configuration.
	 *
	 * @param configuration
	 */
	public SpreadsheetImportConfiguration(SpreadsheetImportConfiguration configuration) {
		columnRange = new Range(configuration.columnRange);
		rowRange = new Range(configuration.rowRange);
		emptyCellValue = configuration.emptyCellValue;
		columnNames = new HashMap<String, String>(configuration.columnNames);
		allRows = configuration.allRows;
		excludeFirstRow = configuration.excludeFirstRow;
		emptyCellPolicy = configuration.emptyCellPolicy;
		ignoreBlankRows = configuration.ignoreBlankRows;
		outputFormat = configuration.outputFormat;
		csvDelimiter = configuration.csvDelimiter;
	}

	/**
	 * Returns the columnRange.
	 *
	 * @return the value of columnRange
	 */
	public Range getColumnRange() {
		return columnRange;
	}

	/**
	 * Sets the columnRange.
	 *
	 * @param columnRange
	 *            the new value for columnRange
	 */
	@ConfigurationProperty(name = "columnRange", label = "Column Range", description = "The range of columns to be imported (e.g. columns 2 to 7")
	public void setColumnRange(Range columnRange) {
		this.columnRange = columnRange;
	}

	/**
	 * Returns the rowRange.
	 *
	 * @return the value of rowRange
	 */
	public Range getRowRange() {
		return rowRange;
	}

	/**
	 * Sets the rowRange.
	 *
	 * @param rowRange
	 *            the new value for rowRange
	 */
	@ConfigurationProperty(name = "rowRange", label = "Row Range", description = "The range of rows to be imported (e.g. rows 1 to 15", required = false)
	public void setRowRange(Range rowRange) {
		this.rowRange = rowRange;
	}

	/**
	 * Returns the emptyCellValue. The default value is "".
	 *
	 * @return the value of emptyCellValue
	 */
	public String getEmptyCellValue() {
		return emptyCellValue;
	}

	/**
	 * Sets the emptyCellValue.
	 *
	 * @param emptyCellValue
	 *            the new value for emptyCellValue
	 */
	@ConfigurationProperty(name = "emptyCellValue", label = "Empty Cell Value", description = "The value to use for empty cells. The default is \"\"", required = false)
	public void setEmptyCellValue(String emptyCellValue) {
		this.emptyCellValue = emptyCellValue;
	}

	/**
	 * Returns the columnNames. The default value is an empty map.
	 *
	 * @return the value of columnNames
	 */
	public Map<String, String> getColumnNames() {
		return columnNames;
	}

	/**
	 * Sets the columnNames.
	 *
	 * @param columnNames
	 *            the new value for columnNames
	 */
	public void setColumnNames(Map<String, String> columnNames) {
		this.columnNames = columnNames;
	}

	/**
	 * Sets the columnNames.
	 *
	 * @param columnNames
	 *            the new value for columnNames
	 */
	@ConfigurationProperty(name = "columnNames", label = "Column Name Mapping", description = "Mapping from column to port names", required = false)
	public void setColumnNames(Set<Mapping> columnNames) {
		Map<String, String> columnNamesMap = new HashMap<String, String>();
		for (Mapping mapping : columnNames) {
			columnNamesMap.put(mapping.column, mapping.port);
		}
		this.columnNames = columnNamesMap;
	}

	/**
	 * Returns the allRows property. The default value is <code>true</code>.
	 *
	 * @return the value of allRows
	 */
	public boolean isAllRows() {
		return allRows;
	}

	/**
	 * Sets the allRows property.
	 *
	 * @param allRows
	 *            the new value for allRows
	 */
	@ConfigurationProperty(name = "allRows", label = "Import All Rows", description = "Imports all the rows containing data", required = false)
	public void setAllRows(boolean allRows) {
		this.allRows = allRows;
	}

	/**
	 * Returns the excludeFirstRow property. The default value is <code>false</code>.
	 *
	 * @return the value of excludeFirstRow
	 */
	public boolean isExcludeFirstRow() {
		return excludeFirstRow;
	}

	/**
	 * Sets the excludeFirstRow property.
	 *
	 * @param excludeFirstRow
	 *            the new value for excludeFirstRow
	 */
	@ConfigurationProperty(name = "excludeFirstRow", label = "Exclude First Row", description = "Excludes the first row from the import", required = false)
	public void setExcludeFirstRow(boolean excludeFirstRow) {
		this.excludeFirstRow = excludeFirstRow;
	}

	/**
	 * Returns the ignoreBlankRows property. The default value is <code>false</code>.
	 *
	 * @return the value of ignoreBlankRows
	 */
	public boolean isIgnoreBlankRows() {
		return ignoreBlankRows;
	}

	/**
	 * Sets the ignoreBlankRows property.
	 *
	 * @param ignoreBlankRows the new value for ignoreBlankRows
	 */
	@ConfigurationProperty(name = "ignoreBlankRows", label = "Ignore Blank Rows", description = "Excludes blank rows from the import", required = false)
	public void setIgnoreBlankRows(boolean ignoreBlankRows) {
		this.ignoreBlankRows = ignoreBlankRows;
	}

	/**
	 * Returns the emptyCellPolicy. The default value is
	 * <code>SpreadsheetEmptyCellPolicy.EMPTY_STRING</code>.
	 *
	 * @return the value of emptyCellPolicy
	 */
	public SpreadsheetEmptyCellPolicy getEmptyCellPolicy() {
		return emptyCellPolicy;
	}

	/**
	 * Sets the emptyCellPolicy.
	 *
	 * @param emptyCellPolicy
	 *            the new value for emptyCellPolicy
	 */
	@ConfigurationProperty(name = "emptyCellPolicy", label = "Empty Cell Policy", description = "Policy for handling empty cells", required = false)
	public void setEmptyCellPolicy(SpreadsheetEmptyCellPolicy emptyCellPolicy) {
		this.emptyCellPolicy = emptyCellPolicy;
	}

	/**
	 * Returns the outputFormat. The default value is
	 * <code>SpreadsheetOutputFormat.PORT_PER_COLUMN</code>.
	 *
	 * @return the value of outputFormat
	 */
	public SpreadsheetOutputFormat getOutputFormat() {
		return outputFormat == null ? SpreadsheetOutputFormat.PORT_PER_COLUMN : outputFormat;
	}

	/**
	 * Sets the outputFormat.
	 *
	 * @param outputFormat
	 *            the new value for outputFormat
	 */
	@ConfigurationProperty(name = "outputFormat", label = "Output Format", description = "How the activity outputs are to be formatted", required = false)
	public void setOutputFormat(SpreadsheetOutputFormat outputFormat) {
		this.outputFormat = outputFormat;
	}

	/**
	 * Returns the delimiter for CSV formatted output. The default value is
	 * <code>","</code>.
	 *
	 * @return the delimiter for CSV formatted output
	 */
	public String getCsvDelimiter() {
		return csvDelimiter == null ? "," : csvDelimiter;
	}

	/**
	 * Sets the delimiter for CSV formatted output.
	 *
	 * @param outputFormat
	 *            the new delimiter for CSV formatted output
	 */
	@ConfigurationProperty(name = "csvDelimiter", label = "CSV Delimiter", description = "The delimiter to use for CSV input files. The default is ','", required = false)
	public void setCsvDelimiter(String csvDelimiter) {
		this.csvDelimiter = csvDelimiter;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (allRows ? 1231 : 1237);
		result = prime * result + ((columnNames == null) ? 0 : columnNames.hashCode());
		result = prime * result + ((columnRange == null) ? 0 : columnRange.hashCode());
		result = prime * result + ((csvDelimiter == null) ? 0 : csvDelimiter.hashCode());
		result = prime * result + ((emptyCellPolicy == null) ? 0 : emptyCellPolicy.hashCode());
		result = prime * result + ((emptyCellValue == null) ? 0 : emptyCellValue.hashCode());
		result = prime * result + (excludeFirstRow ? 1231 : 1237);
		result = prime * result + (ignoreBlankRows ? 1231 : 1237);
		result = prime * result + ((outputFormat == null) ? 0 : outputFormat.hashCode());
		result = prime * result + ((rowRange == null) ? 0 : rowRange.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (getClass() != obj.getClass()) {
			return false;
		}
		SpreadsheetImportConfiguration other = (SpreadsheetImportConfiguration) obj;
		if (allRows != other.allRows) {
			return false;
		}
		if (columnNames == null) {
			if (other.columnNames != null) {
				return false;
			}
		} else if (!columnNames.equals(other.columnNames)) {
			return false;
		}
		if (columnRange == null) {
			if (other.columnRange != null) {
				return false;
			}
		} else if (!columnRange.equals(other.columnRange)) {
			return false;
		}
		if (csvDelimiter == null) {
			if (other.csvDelimiter != null) {
				return false;
			}
		} else if (!csvDelimiter.equals(other.csvDelimiter)) {
			return false;
		}
		if (emptyCellPolicy == null) {
			if (other.emptyCellPolicy != null) {
				return false;
			}
		} else if (!emptyCellPolicy.equals(other.emptyCellPolicy)) {
			return false;
		}
		if (emptyCellValue == null) {
			if (other.emptyCellValue != null) {
				return false;
			}
		} else if (!emptyCellValue.equals(other.emptyCellValue)) {
			return false;
		}
		if (excludeFirstRow != other.excludeFirstRow) {
			return false;
		}
		if (ignoreBlankRows != other.ignoreBlankRows) {
			return false;
		}
		if (outputFormat == null) {
			if (other.outputFormat != null) {
				return false;
			}
		} else if (!outputFormat.equals(other.outputFormat)) {
			return false;
		}
		if (rowRange == null) {
			if (other.rowRange != null) {
				return false;
			}
		} else if (!rowRange.equals(other.rowRange)) {
			return false;
		}
		return true;
	}

	@ConfigurationBean(uri = SpreadsheetImportActivity.URI + "/Mapping")
	public static class Mapping {
		private String column, port;

		public Mapping() {
		}

		public String getColumn() {
			return column;
		}

		@ConfigurationProperty(name = "column", label = "Column", description = "The name of the column")
		public void setColumn(String column) {
			this.column = column;
		}

		public String getPort() {
			return port;
		}

		@ConfigurationProperty(name = "port", label = "Port", description = "The name of the port")
		public void setPort(String port) {
			this.port = port;
		}
	}

}
