/*=============================================================================#
 # Copyright (c) 2007, 2020 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.ltk.ui;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.Job;

import org.eclipse.statet.jcommons.collections.CopyOnWriteIdentityListSet;
import org.eclipse.statet.jcommons.collections.ImCollections;
import org.eclipse.statet.jcommons.collections.ImIdentityList;
import org.eclipse.statet.jcommons.lang.Disposable;

import org.eclipse.statet.ltk.ast.core.AstInfo;
import org.eclipse.statet.ltk.core.WorkingContext;
import org.eclipse.statet.ltk.model.core.ElementChangedEvent;
import org.eclipse.statet.ltk.model.core.ElementChangedListener;
import org.eclipse.statet.ltk.model.core.ModelManager;
import org.eclipse.statet.ltk.model.core.element.LtkModelElementDelta;
import org.eclipse.statet.ltk.model.core.element.SourceUnit;


/**
 * Controller implementation for input of a part and its model updates.
 */
public class ElementInfoController implements IModelElementInputProvider, Disposable {
	
	private static int NEWINPUT_DELAY= 100;
	
	
	private final ModelManager modelProvider;
	private final WorkingContext modelContext;
	private final ElementChangedListener elementChangeListener;
	
	private final CopyOnWriteIdentityListSet<IModelElementInputListener> listenerList= new CopyOnWriteIdentityListSet<>();
	private final CopyOnWriteIdentityListSet<IModelElementInputListener> newListenerList= new CopyOnWriteIdentityListSet<>();
	
	private final Object inputLock= new Object();
	private volatile SourceUnit input;
	private SourceUnit newInput;
	private final NewInputUpdater newInputJob= new NewInputUpdater();
	
	private class NewInputUpdater extends Job implements ISchedulingRule {
		
		public NewInputUpdater() {
			super("ViewPart Model Element Updater"); // //$NON-NLS-1$
			setPriority(Job.SHORT);
			setRule(this);
			setSystem(true);
			setUser(false);
		}
		
		@Override
		public boolean contains(final ISchedulingRule rule) {
			return (rule == this);
		}
		
		@Override
		public boolean isConflicting(final ISchedulingRule rule) {
			return (rule == this);
		}
		
		@Override
		protected IStatus run(final IProgressMonitor monitor) {
			SourceUnit input;
			ImIdentityList<IModelElementInputListener> listeners;
			synchronized (ElementInfoController.this.inputLock) {
				if (monitor.isCanceled()
						|| (ElementInfoController.this.input == null && ElementInfoController.this.newInput == null)) {
					return Status.CANCEL_STATUS;
				}
				if (ElementInfoController.this.newInput == null) {
					listeners= checkNewListeners();
				}
				else {
					final AstInfo astInfo= ElementInfoController.this.newInput.getAstInfo(null, false, null);
					if (astInfo == null || (astInfo.getLevel() & AstInfo.DEFAULT_LEVEL_MASK) < 1) {
						return Status.CANCEL_STATUS;
					}
					ElementInfoController.this.input= ElementInfoController.this.newInput;
					ElementInfoController.this.newInput= null;
					checkNewListeners();
					listeners= ElementInfoController.this.listenerList.toList();
				}
				input= ElementInfoController.this.input;
			}
			
			if (listeners != null) {
				notifyInitial(listeners, input, monitor);
			}
			return Status.OK_STATUS;
		}
		
		@Override
		protected void canceling() {
			ElementInfoController.this.notifyMonitor.setCanceled(true);
		}
		
	}
	private final IProgressMonitor notifyMonitor= new NullProgressMonitor();
	
	
	public ElementInfoController(final ModelManager manager, final WorkingContext context) {
		this.elementChangeListener= new ElementChangedListener() {
			@Override
			public void elementChanged(final ElementChangedEvent event) {
				SourceUnit input;
				ImIdentityList<IModelElementInputListener> listeners;
				synchronized (ElementInfoController.this.inputLock) {
					if (ElementInfoController.this.newInput != null && ElementInfoController.this.newInput.equals(event.delta.getModelElement())) {
						if (ElementInfoController.this.newInputJob.getState() != Job.WAITING) {
							ElementInfoController.this.newInputJob.schedule();
						}
						return;
					}
					if (ElementInfoController.this.input == null || !ElementInfoController.this.input.equals(event.delta.getModelElement())) {
						return;
					}
					input= ElementInfoController.this.input;
					listeners= ElementInfoController.this.listenerList.toList();
				}
				
				try {
					final IProgressMonitor monitor= new NullProgressMonitor();
					Job.getJobManager().beginRule(ElementInfoController.this.newInputJob, monitor);
					notifyUpdated(listeners, input, event.delta, monitor);
				}
				finally {
					Job.getJobManager().endRule(ElementInfoController.this.newInputJob);
				}
			}
		};
		
		this.modelProvider= manager;
		this.modelContext= context;
		this.modelProvider.addElementChangedListener(this.elementChangeListener, this.modelContext);
	}
	
	@Override
	public void dispose() {
		this.modelProvider.removeElementChangedListener(this.elementChangeListener, this.modelContext);
	}
	
	
	public void setInput(final SourceUnit input) {
		synchronized (this.inputLock) {
			this.input= null;
			this.newInput= input;
			
			checkNewListeners();
			this.newInputJob.cancel();
			notifyChanged(this.listenerList.toList(), input);
		}
		
		this.newInputJob.schedule(NEWINPUT_DELAY);
	}
	
	private ImIdentityList<IModelElementInputListener> checkNewListeners() {
		final ImIdentityList<IModelElementInputListener> listeners= this.newListenerList.clearToList();
		for (final IModelElementInputListener listener : listeners) {
			this.listenerList.add(listener);
		}
		return listeners;
	}
	
	private void notifyChanged(final ImIdentityList<IModelElementInputListener> listeners, final SourceUnit input) {
		for (final IModelElementInputListener listener : listeners) {
			listener.elementChanged(input);
		}
	}
	
	private void notifyInitial(final ImIdentityList<IModelElementInputListener> listeners, final SourceUnit input, 
			final IProgressMonitor monitor) {
		if (listeners.isEmpty() || input != this.input) {
			return;
		}
		try {
			input.connect(monitor);
			for (final IModelElementInputListener listener : listeners) {
				if (input != this.input) {
					return;
				}
				listener.elementInitialInfo(input);
			}
		}
		finally {
			input.disconnect(monitor);
		}
	}
	
	private void notifyUpdated(final ImIdentityList<IModelElementInputListener> listeners, final SourceUnit input, final LtkModelElementDelta delta, 
			final IProgressMonitor monitor) {
		if (input != this.input) {
			return;
		}
		try {
			input.connect(monitor);
			for (final IModelElementInputListener listener : listeners) {
				if (input != this.input) {
					return;
				}
				listener.elementUpdatedInfo(input, delta);
			}
		}
		finally {
			input.disconnect(monitor);
		}
	}
	
	@Override
	public SourceUnit getInput() {
		return this.input;
	}
	
	@Override
	public void addListener(final IModelElementInputListener listener) {
		synchronized (this.inputLock) {
			SourceUnit input= this.newInput;
			if (input == null) {
				input= this.input;
			}
			if (input != null) {
				notifyChanged(ImCollections.newIdentityList(listener), input);
			}
			if (input == null || this.newInput == input) {
				this.listenerList.add(listener);
				return;
			}
			this.newListenerList.add(listener);
		}
		if (this.newInputJob.getState() != Job.WAITING) {
			this.newInputJob.schedule();
		}
	}
	
	@Override
	public void removeListener(final IModelElementInputListener listener) {
		this.newListenerList.remove(listener);
		this.listenerList.remove(listener);
	}
	
}
