/*******************************************************************************
 * Copyright (c) 2000, 2016 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.help.ui.internal.views;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Observable;

import org.eclipse.core.runtime.IPath;
import org.eclipse.help.ui.internal.HelpUIPlugin;
import org.eclipse.jface.dialogs.IDialogSettings;

/**
 * Manages the scope for the federated search.
 */
public class ScopeSetManager extends Observable {
	private ScopeSet activeSet;

	private ScopeSet lastExplicitSet;

	private static final String ACTIVE_SET = "activeScopeSet"; //$NON-NLS-1$

	private ArrayList<ScopeSet> sets;

	private ScopeSet defSet;

	public ScopeSetManager() {
		ensureLocation();
		loadScopeSets();
	}

	public void add(ScopeSet set) {
		sets.add(set);
		setChanged();
	}

	public void remove(ScopeSet set) {
		sets.remove(set);
		set.dispose();
		setChanged();
	}

	public void setActiveSet(ScopeSet set) {
		if (this.activeSet != null) {
			this.activeSet.save();
		}
		this.activeSet = set;
		if (!activeSet.isImplicit())
			lastExplicitSet = set;
		setChanged();
	}

	public boolean restoreLastExplicitSet() {
		if (activeSet != null && activeSet.isImplicit()
				&& lastExplicitSet != null) {
			setActiveSet(lastExplicitSet);
			setChanged();
			return true;
		}
		return false;
	}

	public static void ensureLocation() {
		IPath location = HelpUIPlugin.getDefault().getStateLocation();
		location = location.append(ScopeSet.SCOPE_DIR_NAME);
		File dir = location.toFile();
		if (dir.exists() == false)
			dir.mkdir();
	}

	public void save() {
		ensureLocation();
		for (int i = 0; i < sets.size(); i++) {
			ScopeSet set = sets.get(i);
			set.save();
		}
		IDialogSettings settings = HelpUIPlugin.getDefault()
				.getDialogSettings();
		if (activeSet != null)
			settings.put(ACTIVE_SET, activeSet.getName());
	}

	public ScopeSet[] getScopeSets(boolean implicit) {
		ArrayList<ScopeSet> result = new ArrayList<>();
		for (int i = 0; i < sets.size(); i++) {
			ScopeSet set = sets.get(i);
			if (set.isImplicit() == implicit)
				result.add(set);
			if (!implicit && set.isImplicit() && activeSet==set)
				result.add(set);
		}
		return result.toArray(new ScopeSet[result.size()]);
	}

	private void loadScopeSets() {
		sets = new ArrayList<>();
		IPath location = HelpUIPlugin.getDefault().getStateLocation();
		location = location.append("scope_sets"); //$NON-NLS-1$
		File dir = location.toFile();
		defSet = null;
		if (dir.exists() && dir.isDirectory()) {
			File[] files = dir.listFiles((FilenameFilter) (dir1, name) -> name.endsWith(ScopeSet.EXT)
					|| name.endsWith(HistoryScopeSet.EXT));
			for (int i = 0; i < files.length; i++) {
				File file = files[i];
				String name = file.getName();
				int loc = name.lastIndexOf(ScopeSet.EXT);
				if (loc != -1) {
					ScopeSet set = new ScopeSet(name.substring(0, loc));
					sets.add(set);
					if (set.isDefault())
						defSet = set;
					continue;
				}
				loc = name.lastIndexOf(HistoryScopeSet.EXT);
				if (loc != -1) {
					HistoryScopeSet set = new HistoryScopeSet(name.substring(0,
							loc), null);
					sets.add(set);
				}
			}
		}
		if (sets.size() == 1) {
			activeSet = sets.get(0);
		}
		if (defSet == null) {
			defSet = new ScopeSet();
			sets.add(defSet);
		}

	}

	public ScopeSet getDefaultScope() {
		return defSet;
	}

	/**
	 * @return Returns the activeSet.
	 */
	public ScopeSet getActiveSet() {
		if (activeSet == null) {
			IDialogSettings settings = HelpUIPlugin.getDefault()
					.getDialogSettings();
			String name = settings.get(ACTIVE_SET);
			activeSet = findSet(name);
			if (activeSet == null) {
				return sets.get(0);
			}
			if (!activeSet.isImplicit())
				lastExplicitSet = activeSet;
		}
		return activeSet;
	}

	public ScopeSet findSet(String name) {
		return findSet(name, false);
	}

	public HistoryScopeSet findSearchSet(String expression) {
		for (int i = 0; i < sets.size(); i++) {
			ScopeSet set = sets.get(i);
			if (!set.isImplicit() || !(set instanceof HistoryScopeSet))
				continue;
			HistoryScopeSet sset = (HistoryScopeSet) set;
			if (sset.getExpression().equals(expression))
				return sset;
		}
		return null;
	}

	public ScopeSet findSet(String name, boolean implicit) {
		ScopeSet defaultSet = null;
		for (int i = 0; i < sets.size(); i++) {
			ScopeSet set = sets.get(i);
			if (name != null && set.isImplicit() == implicit) {
				if (set.getName().equals(name))
					return set;
			} else if (set.isDefault())
				defaultSet = set;
		}
		if (!implicit)
			return defaultSet;
		return null;
	}
}