/*******************************************************************************
 * Copyright (c) 2004, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ant.internal.ui.editor.outline;

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

import org.eclipse.ant.core.AntCorePlugin;
import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.ant.internal.ui.AntUIPlugin;
import org.eclipse.ant.internal.ui.model.IAntModel;
import org.eclipse.ant.internal.ui.model.IProblem;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.ui.texteditor.MarkerUtilities;

public class AntEditorMarkerUpdater {

	class AntEditorMarkerUpdaterJob extends WorkspaceJob {

		private final List<IProblem> fProblems;

		public AntEditorMarkerUpdaterJob(List<IProblem> problems) {
			super("Ant editor marker updater job"); //$NON-NLS-1$
			fProblems = problems;
			setSystem(true);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.core.internal.resources.WorkspaceJob#runInWorkspace(org.eclipse.core.runtime.IProgressMonitor)
		 */
		@Override
		public IStatus runInWorkspace(IProgressMonitor monitor) {
			updateMarkers0(fProblems);
			return new Status(IStatus.OK, AntUIPlugin.getUniqueIdentifier(), IStatus.OK, IAntCoreConstants.EMPTY_STRING, null);
		}
	}

	private IAntModel fModel = null;
	private List<IProblem> fCollectedProblems = new ArrayList<>();
	public static final String BUILDFILE_PROBLEM_MARKER = AntUIPlugin.PI_ANTUI + ".buildFileProblem"; //$NON-NLS-1$
	private IFile fFile = null;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ant.internal.ui.editor.outline.IProblemRequestor#acceptProblem(org.eclipse.ant.internal.ui.editor.outline.IProblem)
	 */
	public synchronized void acceptProblem(IProblem problem) {
		if (fCollectedProblems.contains(problem)) {
			return;
		}
		fCollectedProblems.add(problem);
	}

	public synchronized void beginReporting() {
		fCollectedProblems.clear();
	}

	private void removeProblems() {
		IFile file = getFile();
		if (file == null || !file.exists()) {
			return;
		}
		try {
			file.deleteMarkers(BUILDFILE_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE);
		}
		catch (CoreException e) {
			AntUIPlugin.log(e);
		}
	}

	private void createMarker(IProblem problem) {
		IFile file = getFile();
		Map<String, Object> attributes = getMarkerAttributes(problem);
		try {
			MarkerUtilities.createMarker(file, attributes, BUILDFILE_PROBLEM_MARKER);
		}
		catch (CoreException e) {
			AntUIPlugin.log(e);
		}
	}

	public void setModel(IAntModel model) {
		fModel = model;
	}

	public synchronized void updateMarkers() {
		IFile file = getFile();
		if (file != null) {
			List<IProblem> problems = new ArrayList<>(fCollectedProblems.size());
			Iterator<IProblem> e = fCollectedProblems.iterator();
			while (e.hasNext()) {
				problems.add(e.next());
			}
			fCollectedProblems.clear();
			AntEditorMarkerUpdaterJob job = new AntEditorMarkerUpdaterJob(problems);
			job.setRule(ResourcesPlugin.getWorkspace().getRuleFactory().markerRule(file));
			job.schedule();
		}
	}

	private void updateMarkers0(List<IProblem> problems) {
		removeProblems();
		if (!shouldAddMarkers()) {
			return;
		}

		if (problems.size() > 0) {
			Iterator<IProblem> e = problems.iterator();
			while (e.hasNext()) {
				IProblem problem = e.next();
				createMarker(problem);
			}
		}
	}

	private IFile getFile() {
		if (fFile == null) {
			fFile = fModel.getFile();
		}
		return fFile;
	}

	/**
	 * Returns the attributes with which a newly created marker will be initialized.
	 * 
	 * @return the initial marker attributes
	 */
	private Map<String, Object> getMarkerAttributes(IProblem problem) {

		Map<String, Object> attributes = new HashMap<>(11);
		int severity = IMarker.SEVERITY_ERROR;
		if (problem.isWarning()) {
			severity = IMarker.SEVERITY_WARNING;
		}
		// marker line numbers are 1-based
		MarkerUtilities.setMessage(attributes, problem.getUnmodifiedMessage());
		MarkerUtilities.setLineNumber(attributes, problem.getLineNumber());
		MarkerUtilities.setCharStart(attributes, problem.getOffset());
		MarkerUtilities.setCharEnd(attributes, problem.getOffset() + problem.getLength());
		attributes.put(IMarker.SEVERITY, Integer.valueOf(severity));
		return attributes;
	}

	/**
	 * Returns whether or not to add markers to the file based on the file's content type. The content type is considered an Ant buildfile if the XML
	 * has a root &quot;project&quot; element. Content type is defined in the org.eclipse.ant.core plugin.xml.
	 * 
	 * @return whether or not to add markers to the file based on the files content type
	 */
	private boolean shouldAddMarkers() {
		IFile file = getFile();
		if (file == null || !file.exists()) {
			return false;
		}
		IContentDescription description;
		try {
			description = file.getContentDescription();
		}
		catch (CoreException e) {
			return false;
		}
		if (description != null) {
			IContentType type = description.getContentType();
			return type != null && AntCorePlugin.ANT_BUILDFILE_CONTENT_TYPE.equals(type.getId());
		}
		return false;
	}
}
