/*=============================================================================#
 # Copyright (c) 2015, 2019 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.ecommons.io;

import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.Diffs;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.variables.IStringVariable;

import org.eclipse.statet.ecommons.variables.core.ObservableVariable;


public class ObservableFileValidator extends FileValidator {
	
	
	private class ResourceObservableValue extends AbstractObservableValue<IResource> {
		
		
		private IResource value;
		
		
		public ResourceObservableValue(final Realm realm) {
			super(realm);
		}
		
		
		@Override
		public Object getValueType() {
			return IResource.class;
		}
		
		@Override
		protected IResource doGetValue() {
			return this.value;
		}
		
		@Override
		protected void doSetValue(final IResource value) {
			setExplicit(value);
			checkExplicit();
		}
		
		void update(final IResource newValue) {
			if ((newValue != null) ? !newValue.equals(this.value) : null != this.value) {
				fireValueChange(Diffs.createValueDiff(this.value, this.value= newValue));
			}
		}
		
	}
	
	private class FileStoreObservableValue extends AbstractObservableValue<IFileStore> {
		
		
		private IFileStore value;
		
		
		public FileStoreObservableValue(final Realm realm) {
			super(realm);
		}
		
		
		@Override
		public Object getValueType() {
			return IFileStore.class;
		}
		
		@Override
		protected IFileStore doGetValue() {
			return this.value;
		}
		
		@Override
		protected void doSetValue(final IFileStore value) {
			setExplicit(value);
			checkExplicit();
		}
		
		void update(final IFileStore newValue) {
			if ((newValue != null) ? !newValue.equals(this.value) : null != this.value) {
				fireValueChange(Diffs.createValueDiff(this.value, this.value= newValue));
			}
		}
		
	}
	
	
	private final Realm realm;
	
	private IChangeListener observableListener;
	
	private ResourceObservableValue resourceObservable;
	private FileStoreObservableValue fileStoreObservable;
	
	
	public ObservableFileValidator(final Realm realm) {
		this.realm= realm;
	}
	
	
	@Override
	void checkVariable(final IStringVariable variable) {
		if (variable instanceof ObservableVariable) {
			if (this.observableListener == null) {
				this.observableListener= new IChangeListener() {
					@Override
					public void handleChange(final ChangeEvent event) {
						updateVariableResolution();
					}
				};
			}
			((ObservableVariable) variable).addChangeListener(this.observableListener);
		}
	}
	
	@Override
	protected void setStatus(final IStatus status) {
		super.setStatus(status);
		
		if (this.resourceObservable != null) {
			this.resourceObservable.update(getWorkspaceResource());
		}
		if (this.fileStoreObservable != null) {
			this.fileStoreObservable.update(getFileStore());
		}
	}
	
	public IObservableValue<IResource> getWorkspaceResourceObservable() {
		if (this.resourceObservable == null) {
			this.resourceObservable= new ResourceObservableValue(this.realm);
			this.resourceObservable.update(getWorkspaceResource());
		}
		return this.resourceObservable;
	}
	
	public IObservableValue<IFileStore> getFileStoreObservable() {
		if (this.resourceObservable == null) {
			this.fileStoreObservable= new FileStoreObservableValue(this.realm);
			this.fileStoreObservable.update(getFileStore());
		}
		return this.fileStoreObservable;
	}
	
}
