/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.compare.internal;

import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;

import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.ICompareFilter;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;

/**
 * Toggles the activation of a compare filter
 */
public class ChangeCompareFilterPropertyAction extends Action implements
		IPropertyChangeListener, DisposeListener {

	public static final String COMPARE_FILTERS = "COMPARE_FILTERS"; //$NON-NLS-1$
	public static final String COMPARE_FILTER_ACTIONS = "COMPARE_FILTER_ACTIONS"; //$NON-NLS-1$
	public static final String COMPARE_FILTERS_INITIALIZING = "COMPARE_FILTERS_INITIALIZING"; //$NON-NLS-1$

	private CompareConfiguration fCompareConfiguration;
	private ResourceBundle fBundle;
	private String fPrefix = "filter."; //$NON-NLS-1$
	private CompareFilterDescriptor fCompareFilterDescriptor;
	private ICompareFilter fCompareFilter;

	public ChangeCompareFilterPropertyAction(
			CompareFilterDescriptor compareFilterDescriptor,
			CompareConfiguration compareConfiguration) {
		this.fBundle = compareFilterDescriptor.getResourceBundle();
		this.fCompareFilterDescriptor = compareFilterDescriptor;
		this.fCompareFilter = compareFilterDescriptor.createCompareFilter();
		Utilities.initAction(this, fBundle, fPrefix);

		// Utilities only loads images from compare plugin
		setImageDescriptor(compareFilterDescriptor.getImageDescriptor());
		setId(compareFilterDescriptor.getFilterId());
		setActionDefinitionId(compareFilterDescriptor.getDefinitionId());
		setCompareConfiguration(compareConfiguration);

		if (fCompareFilter.isEnabledInitially()) {
			setChecked(true);
			setProperty(true);
		}
	}

	@SuppressWarnings("unchecked")
	void setProperty(boolean state) {
		if (fCompareConfiguration != null) {
			Map<String, ICompareFilter> filters = new HashMap<>();
			if (fCompareConfiguration.getProperty(COMPARE_FILTERS) != null) {
				filters.putAll(
						(Map<String, ICompareFilter>) fCompareConfiguration
						.getProperty(COMPARE_FILTERS));
			}
			if (state) {
				filters.put(fCompareFilterDescriptor.getFilterId(),
						fCompareFilter);
			} else {
				filters.remove(fCompareFilterDescriptor.getFilterId());
			}
			fCompareConfiguration.setProperty(COMPARE_FILTERS, filters);
		}
	}

	@SuppressWarnings("unchecked")
	boolean getProperty() {
		Map<String, ICompareFilter> filters = (Map<String, ICompareFilter>) fCompareConfiguration
				.getProperty(COMPARE_FILTERS);
		if (filters == null) {
			filters = new HashMap<>();
		}
		return filters.containsKey(fCompareFilterDescriptor.getFilterId());
	}

	@Override
	public void run() {
		boolean b = !getProperty();
		setChecked(b);
		setProperty(b);
	}

	@Override
	public void setChecked(boolean state) {
		super.setChecked(state);
		Utilities.initToggleAction(this, fBundle, fPrefix, state);
	}

	public void setCompareConfiguration(CompareConfiguration cc) {
		if (fCompareConfiguration != null)
			fCompareConfiguration.removePropertyChangeListener(this);
		fCompareConfiguration = cc;
		if (fCompareConfiguration != null)
			fCompareConfiguration.addPropertyChangeListener(this);
		setChecked(getProperty());
	}

	@SuppressWarnings("unchecked")
	@Override
	public void propertyChange(PropertyChangeEvent event) {
		if (event.getProperty().equals(COMPARE_FILTERS)
				&& event.getNewValue() instanceof Map) {
			setChecked(((Map<String, ICompareFilter>) event.getNewValue())
					.containsKey(fCompareFilterDescriptor.getFilterId()));
		}
	}

	public void dispose() {
		if (fCompareConfiguration != null)
			fCompareConfiguration.removePropertyChangeListener(this);
	}

	@Override
	public void widgetDisposed(DisposeEvent e) {
		dispose();
	}

	public String getFilterId() {
		return fCompareFilterDescriptor.getFilterId();
	}

	public void setInput(Object input, Object ancestor, Object left,
			Object right) {
		fCompareFilter.setInput(input, ancestor, left, right);
	}
}
