package org.eclipse.emf.henshin.variability.ui.views;

import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.IDisposeListener;
import org.eclipse.core.databinding.observable.IStaleListener;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
import org.eclipse.emf.databinding.internal.EMFObservableValueDecorator;
import org.eclipse.emf.henshin.model.Rule;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityConstants;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityFactory;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityRule;
import org.eclipse.emf.henshin.variability.wrapper.VariabilityTransactionHelper;

/**
 * Provides an observable value for the Feature Model {@link org.eclipse.emf.henshin.model.Annotation Annotation} of variability-aware {@link Rule}s.
 * 
 * @author Stefan Schulz
 *
 * @param <T>
 */
public class ObservableFeatureModelValue<T> implements IObservableValue<String>{
	
	IObservableValue<String> value;
	boolean shouldUpdate;
	
	ObservableFeatureModelValue(IObservableValue<String> value) {
		this.value = value;
	}
	
	
	@Override
	public Realm getRealm() {
		return value.getRealm();
	}

	@Override
	public void addChangeListener(IChangeListener listener) {
		value.addChangeListener(listener);
	}

	@Override
	public void removeChangeListener(IChangeListener listener) {
		value.removeChangeListener(listener);
	}

	@Override
	public void addStaleListener(IStaleListener listener) {
		value.addStaleListener(listener);
	}

	@Override
	public void removeStaleListener(IStaleListener listener) {
		value.removeStaleListener(listener);
	}

	@Override
	public boolean isStale() {
		return value.isStale();
	}

	@Override
	public void addDisposeListener(IDisposeListener listener) {
		value.addDisposeListener(listener);
	}

	@Override
	public void removeDisposeListener(IDisposeListener listener) {
		value.removeDisposeListener(listener);
	}

	@Override
	public boolean isDisposed() {
		return value.isDisposed();
	}

	@Override
	public void dispose() {
		value.dispose();
	}

	@Override
	public Object getValueType() {
		return value.getValueType();
	}

	@Override
	public String getValue() {
		VariabilityRule rule = getTargetVariabilityRule();
		if (rule != null) {
			return getTargetVariabilityRule().getFeatureModel();			
		} else {
			return value.getValue().toString();
		}
	}

	@Override
	public void setValue(String value) {
		shouldUpdate = false;
		VariabilityRule rule = getTargetVariabilityRule();
		if (rule != null) {
			VariabilityTransactionHelper.setAnnotationValue(rule, VariabilityConstants.FEATURE_MODEL, value);
		}
		shouldUpdate = true;
	}

	@Override
	public void addValueChangeListener(IValueChangeListener<? super String> listener) {
		value.addValueChangeListener(listener);
	}

	@Override
	public void removeValueChangeListener(IValueChangeListener<? super String> listener) {
		value.removeValueChangeListener(listener);
		
	}
	
	private VariabilityRule getTargetVariabilityRule() {
		if (this.value instanceof EMFObservableValueDecorator) {
			EMFObservableValueDecorator emfValue = (EMFObservableValueDecorator) this.value;
			
			if (emfValue.getObserved() != null &&  emfValue.getObserved() instanceof Rule) {
				return VariabilityFactory.createVariabilityRule((Rule) emfValue.getObserved());
			}
		}
		return null;
	}


	public boolean shouldUpdate() {
		return shouldUpdate;
	}
}
