/*******************************************************************************
 * 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<>();
	private Map<IFile, List<MarkerInfo>> fFileToMarkerInfo = new HashMap<>();
	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<>();
			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<>(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();
		}
	}
}