/*******************************************************************************
 * Copyright (c) 2009, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     Nicolas Bros (Mia-Software)
 *******************************************************************************/
package org.eclipse.modisco.infra.browser.queries;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.modisco.infra.browser.uicore.ChangeListener;
import org.eclipse.modisco.infra.query.ModelQuery;

/**
 * Contains the information about queries that have been added to model
 * elements. Supports adding and removing selected queries, with notifications
 * to listeners.
 */
public class SelectedQueriesManager {
	/** Associations between model elements and queries */
	private final Map<EObject, List<SelectedQuery>> selectedQueries = new HashMap<EObject, List<SelectedQuery>>();

	public void add(final EObject eObject, final ModelQuery modelQuery) {
		if (modelQuery == null) {
			throw new IllegalArgumentException("modelQuery is null"); //$NON-NLS-1$
		}

		List<SelectedQuery> list = this.selectedQueries.get(eObject);
		if (list == null) {
			list = new ArrayList<SelectedQuery>();
			this.selectedQueries.put(eObject, list);
		}
		for (SelectedQuery selectedQuery : list) {
			if (selectedQuery.getModelQuery() == modelQuery) {
				// don't duplicate the query
				return;
			}
		}
		SelectedQuery selectedQuery = new SelectedQuery(modelQuery, eObject, this);
		list.add(selectedQuery);
		fireChangeNotification();
	}

	public void remove(final SelectedQuery selectedQuery) {
		boolean changed = false;
		Collection<List<SelectedQuery>> values = this.selectedQueries.values();
		for (List<SelectedQuery> list : values) {
			ListIterator<SelectedQuery> listIterator = list.listIterator();
			while (listIterator.hasNext()) {
				if (listIterator.next() == selectedQuery) {
					changed = true;
					listIterator.remove();
				}
			}
		}
		if (changed) {
			fireChangeNotification();
		}
	}

	public void clear() {
		this.selectedQueries.clear();
		fireChangeNotification();
	}

	/**
	 * Returns the queries selected for the given model element.
	 *
	 * @return a list of selected queries (which can be empty) or
	 *         <code>null</code>
	 */
	public List<SelectedQuery> getSelectedQueriesFor(final EObject eObject) {
		return this.selectedQueries.get(eObject);
	}

	private final List<ChangeListener> changeListeners = new ArrayList<ChangeListener>();

	public void addChangeListener(final ChangeListener listener) {
		if (!this.changeListeners.contains(listener)) {
			this.changeListeners.add(listener);
		}
	}

	public void removeChangeListener(final ChangeListener listener) {
		this.changeListeners.remove(listener);
	}

	public void fireChangeNotification() {
		for (final ChangeListener changeListener : this.changeListeners) {
			changeListener.changed();
		}
	}

}
