/*******************************************************************************
 * Copyright (c) 2009, 2010 Frank Becker and others.
 * 
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * https://www.eclipse.org/legal/epl-2.0
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Frank Becker - initial API and implementation
 *     Tasktop Technologies - improvements
 *******************************************************************************/

package org.eclipse.mylyn.internal.tasks.ui.util;

import org.eclipse.core.runtime.Assert;
import org.eclipse.ui.IMemento;

/**
 * @author Frank Becker
 * @author Steffen Pingel
 */
public class SortCriterion {

	public enum SortKey {
		NONE, DATE_CREATED, PRIORITY, RANK, SUMMARY, TASK_ID, TASK_TYPE, DUE_DATE, MODIFICATION_DATE, SCHEDULED_DATE;

		public static SortKey valueOfLabel(String label) {
			for (SortKey value : values()) {
				if (value.getLabel().equals(label)) {
					return value;
				}
			}
			return null;
		}

		public String getLabel() {
			switch (this) {
			case NONE:
				return Messages.SortKindEntry_None;
			case PRIORITY:
				return Messages.SortKindEntry_Priority;
			case SUMMARY:
				return Messages.SortKindEntry_Summary;
			case RANK:
				return Messages.SortKindEntry_Rank;
			case DATE_CREATED:
				return Messages.SortKindEntry_Date_Created;
			case TASK_ID:
				return Messages.SortKindEntry_Task_ID;
			case TASK_TYPE:
				return Messages.SortCriterion_Type;
			case DUE_DATE:
				return Messages.SortKindEntry_Due_Date;
			case MODIFICATION_DATE:
				return Messages.SortCriterion_Modification_Date;
			case SCHEDULED_DATE:
				return Messages.SortCriterion_Scheduled_Date;
			default:
				return null;
			}
		}

	}

	private static final String MEMENTO_KEY_SORT_KEY = "sortKey"; //$NON-NLS-1$

	private static final String MEMENTO_KEY_SORT_DIRECTION = "sortDirection"; //$NON-NLS-1$

	private static final SortKey DEFAULT_SORT_KIND = SortKey.NONE;

	public static final int ASCENDING = 1;

	public static final int DESCENDING = -1;

	private static final int DEFAULT_SORT_DIRECTION = ASCENDING;

	public static final int kindCount = SortKey.values().length - 1;

	private SortKey key;

	private int direction;

	public SortCriterion() {
		key = DEFAULT_SORT_KIND;
		direction = DEFAULT_SORT_DIRECTION;
	}

	public SortCriterion(SortKey kind, int sortDirection) {
		this.key = kind;
		this.direction = sortDirection;
	}

	public SortKey getKey() {
		return key;
	}

	public void setKey(SortKey kind) {
		Assert.isNotNull(kind);
		this.key = kind;
	}

	public int getDirection() {
		return direction;
	}

	public void setDirection(int sortDirection) {
		Assert.isTrue(sortDirection == -1 || sortDirection == 1);
		this.direction = sortDirection;
	}

	private SortKey getSortKey(IMemento memento, String key, SortKey defaultValue) {
		String value = memento.getString(key);
		if (value != null) {
			try {
				return SortKey.valueOf(value);
			} catch (IllegalArgumentException e) {
				// ignore
			}
		}
		return defaultValue;
	}

	private int getSortDirection(IMemento memento, String key, int defaultValue) {
		Integer value = memento.getInteger(key);
		if (value != null) {
			return value >= 0 ? 1 : -1;
		}
		return defaultValue;
	}

	public void restoreState(IMemento memento) {
		setKey(getSortKey(memento, MEMENTO_KEY_SORT_KEY, DEFAULT_SORT_KIND));
		setDirection(getSortDirection(memento, MEMENTO_KEY_SORT_DIRECTION, DEFAULT_SORT_DIRECTION));
	}

	public void saveState(IMemento memento) {
		memento.putString(MEMENTO_KEY_SORT_KEY, getKey().name());
		memento.putInteger(MEMENTO_KEY_SORT_DIRECTION, getDirection());
	}
}
