/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ant.internal.ui.model;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.ant.internal.launching.debug.model.AntLineBreakpoint;
import org.eclipse.ant.internal.launching.debug.model.DebugModelMessages;
import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointsListener;
import org.eclipse.debug.core.model.IBreakpoint;

import com.ibm.icu.text.MessageFormat;

public class AntModelCore implements IBreakpointsListener {

	private static AntModelCore inst;

	public static AntModelCore getDefault() {
		if (inst == null) {
			inst = new AntModelCore();
		}

		return inst;
	}

	private List<IAntModelListener> fModelChangeListeners = new ArrayList<>();

	private AntModelCore() {
	}

	public void addAntModelListener(IAntModelListener listener) {
		synchronized (fModelChangeListeners) {
			fModelChangeListeners.add(listener);
		}
	}

	public void removeAntModelListener(IAntModelListener listener) {
		synchronized (fModelChangeListeners) {
			fModelChangeListeners.remove(listener);
		}
	}

	public void notifyAntModelListeners(AntModelChangeEvent event) {
		Iterator<IAntModelListener> i;
		synchronized (fModelChangeListeners) {
			i = new ArrayList<>(fModelChangeListeners).iterator();
		}
		while (i.hasNext()) {
			i.next().antModelChanged(event);
		}
	}

	/**
	 * Updates message attributes on any Ant line breakpoints if there are active Ant editors with Ant models
	 * 
	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])
	 */
	private void updateBreakpointMessages(final IBreakpoint[] breakpoints) {
		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
			@Override
			public void run(IProgressMonitor monitor) throws CoreException {
				for (int i = 0; i < breakpoints.length; i++) {
					IBreakpoint breakpoint = breakpoints[i];
					if (breakpoint instanceof AntLineBreakpoint) {
						IMarker marker = breakpoint.getMarker();
						if (marker.exists()) {
							int lineNumber = marker.getAttribute(IMarker.LINE_NUMBER, 0);
							marker.setAttribute(IMarker.MESSAGE, MessageFormat.format(DebugModelMessages.AntLineBreakpoint_0, new Object[] { Integer.toString(lineNumber) }));
						}
					}
				}
			}
		};
		try {
			ResourcesPlugin.getWorkspace().run(runnable, null, 0, null);
		}
		catch (CoreException e) {
			AntUIPlugin.log(e);
		}
	}

	@Override
	public void breakpointsAdded(IBreakpoint[] breakpoints) {
		// do nothing
	}

	@Override
	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
		// do nothing
	}

	@Override
	public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
		updateBreakpointMessages(breakpoints);
	}

	public void stopBreakpointListening() {
		DebugPlugin.getDefault().getBreakpointManager().removeBreakpointListener(this);
	}

	public void startBreakpointListening() {
		DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
	}
}
