package osmedile.intellij.stringmanip.align;

import com.intellij.util.xmlb.annotations.Transient;
import osmedile.intellij.stringmanip.sort.support.SortSettings;
import shaded.org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

public class ColumnAlignerModel {
	private Date added;
	private List<String> separators = new ArrayList<String>();
	private boolean spaceBeforeSeparator = true;
	private boolean spaceAfterSeparator = true;
	private boolean trimValues = true;
	private boolean trimLines = false;
	private Align alignBy = Align.SEPARATORS;
	private boolean sequentialProcessing;
	private SortSettings sortSettings = new SortSettings();
	private String columnSortOrder;
	private boolean skipFirstRow;
	private boolean sortOnly;
	private String maxSeparatorsPerLine;

	public ColumnAlignerModel() {
	}

	public ColumnAlignerModel(String... separator) {
		this.separators = Arrays.asList(separator);
	}

	public List<String> getSeparators() {
		return separators;
	}

	public void setSeparators(List<String> separators) {
		this.separators = separators;
	}

	public boolean isSpaceBeforeSeparator() {
		return spaceBeforeSeparator;
	}

	public void setSpaceBeforeSeparator(final boolean spaceBeforeSeparator) {
		this.spaceBeforeSeparator = spaceBeforeSeparator;
	}

	public boolean isSpaceAfterSeparator() {
		return spaceAfterSeparator;
	}

	public void setSpaceAfterSeparator(final boolean spaceAfterSeparator) {
		this.spaceAfterSeparator = spaceAfterSeparator;
	}

	public boolean isTrimValues() {
		return trimValues;
	}

	public void setTrimValues(final boolean trimValues) {
		this.trimValues = trimValues;
	}

	public boolean isTrimLines() {
		return trimLines;
	}

	public void setTrimLines(final boolean trimLines) {
		this.trimLines = trimLines;
	}

	public Align getAlignBy() {
		return alignBy;
	}

	public void setAlignBy(Align alignBy) {
		this.alignBy = alignBy;
	}

	public Date getAdded() {
		return added;
	}

	public void setAdded(Date added) {
		this.added = added;
	}

	public boolean isSequentialProcessing() {
		return sequentialProcessing;
	}

	public void setSequentialProcessing(final boolean sequentialProcessing) {
		this.sequentialProcessing = sequentialProcessing;
	}

	public SortSettings getSortSettings() {
		return sortSettings;
	}

	public void setSortSettings(SortSettings sortSettings) {
		this.sortSettings = sortSettings;
	}

	public String getColumnSortOrder() {
		return columnSortOrder;
	}

	public void setColumnSortOrder(final String columnSortOrder) {
		this.columnSortOrder = columnSortOrder;
	}

	public boolean isSkipFirstRow() {
		return skipFirstRow;
	}

	public void setSkipFirstRow(final boolean skipFirstRow) {
		this.skipFirstRow = skipFirstRow;
	}

	public boolean isSortOnly() {
		return sortOnly;
	}

	public void setSortOnly(final boolean sortOnly) {
		this.sortOnly = sortOnly;
	}

	public String getMaxSeparatorsPerLine() {
		return maxSeparatorsPerLine;
	}

	public void setMaxSeparatorsPerLine(final String maxSeparatorsPerLine) {
		this.maxSeparatorsPerLine = maxSeparatorsPerLine;
	}

	@Transient
	public Integer getMaxSeparatorsPerLineAsInt() {
		Integer integer = null;
		try {
			integer = Integer.valueOf(maxSeparatorsPerLine);
		} catch (Exception e) {
			integer = Integer.MAX_VALUE;
		}
		return integer;
	}

	public enum Align {
		VALUES, SEPARATORS
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;

		ColumnAlignerModel that = (ColumnAlignerModel) o;

		if (spaceBeforeSeparator != that.spaceBeforeSeparator) return false;
		if (spaceAfterSeparator != that.spaceAfterSeparator) return false;
		if (trimValues != that.trimValues) return false;
		if (trimLines != that.trimLines) return false;
		if (sequentialProcessing != that.sequentialProcessing) return false;
		if (skipFirstRow != that.skipFirstRow) return false;
		if (sortOnly != that.sortOnly) return false;
		if (added != null ? !added.equals(that.added) : that.added != null) return false;
		if (separators != null ? !separators.equals(that.separators) : that.separators != null) return false;
		if (alignBy != that.alignBy) return false;
		if (sortSettings != null ? !sortSettings.equals(that.sortSettings) : that.sortSettings != null) return false;
		if (columnSortOrder != null ? !columnSortOrder.equals(that.columnSortOrder) : that.columnSortOrder != null)
			return false;
		return maxSeparatorsPerLine != null ? maxSeparatorsPerLine.equals(that.maxSeparatorsPerLine) : that.maxSeparatorsPerLine == null;
	}

	@Override
	public int hashCode() {
		int result = added != null ? added.hashCode() : 0;
		result = 31 * result + (separators != null ? separators.hashCode() : 0);
		result = 31 * result + (spaceBeforeSeparator ? 1 : 0);
		result = 31 * result + (spaceAfterSeparator ? 1 : 0);
		result = 31 * result + (trimValues ? 1 : 0);
		result = 31 * result + (trimLines ? 1 : 0);
		result = 31 * result + (alignBy != null ? alignBy.hashCode() : 0);
		result = 31 * result + (sequentialProcessing ? 1 : 0);
		result = 31 * result + (sortSettings != null ? sortSettings.hashCode() : 0);
		result = 31 * result + (columnSortOrder != null ? columnSortOrder.hashCode() : 0);
		result = 31 * result + (skipFirstRow ? 1 : 0);
		result = 31 * result + (sortOnly ? 1 : 0);
		result = 31 * result + (maxSeparatorsPerLine != null ? maxSeparatorsPerLine.hashCode() : 0);
		return result;
	}

	@Override
	public String toString() {
		String format = "";
		if (added != null) {
			format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(added);
		}


		StringBuilder s = new StringBuilder();
		for (String separator : separators) {
			if (StringUtils.isNotEmpty(separator)) {
				s.append(separator).append(" ");
			}
		}
		return format + " - " + s.toString();
	}
}