/*******************************************************************************
 * Copyright (c) 2006, 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.console;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceRuleFactory;
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.core.runtime.jobs.ISchedulingRule;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.internal.ui.views.console.ProcessConsole;
import org.eclipse.jdt.core.IJavaModelMarker;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.FindReplaceDocumentAdapter;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.ui.console.TextConsole;

public class JavacMarkerCreator {

	private final TextConsole fConsole;
	private IProcess fProcess;
	private static List<IFile> fgFilesToBeCleaned = new ArrayList<IFile>();
	private Map<IFile, List<MarkerInfo>> fFileToMarkerInfo = new HashMap<IFile, List<MarkerInfo>>();
	private final boolean fUseCustomMessage;

	private class MarkerInfo {

		public int fLineNumber;
		public int fOffset;
		public Integer fType;

		public void setLineNumber(int lineNumber) {
			fLineNumber = lineNumber;
		}

		public void setOffset(int offset) {
			fOffset = offset;
		}

		public void setType(Integer type) {
			fType = type;

		}
	}

	public JavacMarkerCreator(TextConsole console, boolean useCustomMessage) {
		fConsole = console;
		fUseCustomMessage = useCustomMessage;
		if (fConsole instanceof ProcessConsole) {
			fProcess = ((ProcessConsole) fConsole).getProcess();
		}
	}

	protected ISchedulingRule getMarkerRule(IResource resource) {
		ISchedulingRule rule = null;
		if (resource != null) {
			IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
			rule = ruleFactory.markerRule(resource);
		}
		return rule;
	}

	protected void run(ISchedulingRule rule, IWorkspaceRunnable wr) {
		try {
			ResourcesPlugin.getWorkspace().run(wr, rule, 0, null);
		}
		catch (CoreException e) {
			AntUIPlugin.log(e.getStatus());
		}
	}

	protected void addFileToBeCleaned(IFile file) {
		fgFilesToBeCleaned.add(file);
	}

	protected void addMarker(IFile file, int lineNumber, int offset, Integer type) {
		MarkerInfo info = new MarkerInfo();
		info.setLineNumber(lineNumber);
		info.setOffset(offset);
		info.setType(type);
		List<MarkerInfo> infos = fFileToMarkerInfo.get(file);
		if (infos == null) {
			infos = new ArrayList<MarkerInfo>();
			fFileToMarkerInfo.put(file, infos);
		}
		infos.add(info);
	}

	private void createMarkers(final IFile file, final List<MarkerInfo> infos) {
		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
			@Override
			public void run(IProgressMonitor monitor) throws CoreException {

				try {
					for (MarkerInfo info : infos) {
						IMarker marker = file.createMarker(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);
						Map<String, Object> attributes = new HashMap<String, Object>(3);
						attributes.put(IMarker.LINE_NUMBER, new Integer(info.fLineNumber));
						String message = getMessage(info);
						attributes.put(IMarker.MESSAGE, message);
						attributes.put(IMarker.SEVERITY, info.fType);
						marker.setAttributes(attributes);
					}
				}
				catch (CoreException e) {
					AntUIPlugin.log(e.getStatus());
				}
			}
		};
		run(getMarkerRule(file), wr);
	}

	protected String getMessage(MarkerInfo info) {
		IDocument doc = fConsole.getDocument();
		String message = ConsoleMessages.JavacMarkerCreator_0;
		if (fUseCustomMessage) {
			FindReplaceDocumentAdapter adapter = new FindReplaceDocumentAdapter(doc);
			try {
				IRegion match = adapter.find(info.fOffset, "[javac] ----------", true, false, false, false); //$NON-NLS-1$
				if (match != null) {
					match = adapter.find(match.getOffset(), "[javac]", false, false, false, false); //$NON-NLS-1$
					if (match != null) {
						int start = match.getOffset() + match.getLength() + 1;
						IRegion lineInfo = doc.getLineInformationOfOffset(start);
						message = doc.get(start, lineInfo.getOffset() - start + lineInfo.getLength());
					}
				}
			}
			catch (BadLocationException e) {
				AntUIPlugin.log(e);
			}
		}

		return message;
	}

	protected void finished(IProcess process) {
		if (process.equals(fProcess)) {
			for (IFile file : fgFilesToBeCleaned) {
				try {
					file.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
				}
				catch (CoreException e) {
					AntUIPlugin.log(e.getStatus());
				}
			}
			for (IFile file : fFileToMarkerInfo.keySet()) {
				createMarkers(file, fFileToMarkerInfo.get(file));
			}
			fFileToMarkerInfo.clear();
			fgFilesToBeCleaned.clear();
		}
	}
}