/*******************************************************************************
 * Copyright (c) 2007, 2018 Red Hat Inc.
 *
 * 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/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *    Red Hat - initial API and implementation
 *    Alphonse Van Assche
 *******************************************************************************/

package org.eclipse.linuxtools.rpm.ui.editor.markers;

import java.util.Iterator;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.quickassist.IQuickFixableAnnotation;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.AnnotationModel;
import org.eclipse.linuxtools.internal.rpm.ui.editor.Activator;
import org.eclipse.linuxtools.internal.rpm.ui.editor.SpecfileEditor;
import org.eclipse.linuxtools.internal.rpm.ui.editor.parser.SpecfileParseException;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.part.FileEditorInput;

public class SpecfileErrorHandler extends SpecfileMarkerHandler {

	public static final String SPECFILE_ERROR_MARKER_ID = Activator.PLUGIN_ID + ".specfileerror"; //$NON-NLS-1$

	public static final String ANNOTATION_ERROR = "org.eclipse.ui.workbench.texteditor.error"; //$NON-NLS-1$
	public static final String ANNOTATION_WARNING = "org.eclipse.ui.workbench.texteditor.warning"; //$NON-NLS-1$
	public static final String ANNOTATION_INFO = "org.eclipse.ui.workbench.texteditor.info"; //$NON-NLS-1$

	private AnnotationModel fAnnotationModel;
	private IEditorInput input;

	public SpecfileErrorHandler(IEditorInput input, IDocument document) {
		super(null, document);
		this.input = input;
		fAnnotationModel = getAnnotationModel();
	}

	private static class SpecfileAnnotation extends Annotation implements IQuickFixableAnnotation {
		public SpecfileAnnotation(String annotationType, boolean persist, String message) {
			super(annotationType, persist, message);
		}

		/**
		 * Tells whether this annotation is quick fixable.
		 */
		private boolean fIsQuickFixable;
		/**
		 * Tells whether the quick fixable state (<code>fIsQuickFixable</code> has been
		 * computed.
		 */
		private boolean fIsQuickFixableStateSet;

		/**
		 * {@inheritDoc}
		 *
		 */
		@Override
		public void setQuickFixable(boolean state) {
			fIsQuickFixable = state;
			fIsQuickFixableStateSet = true;
		}

		/**
		 * {@inheritDoc}
		 *
		 */
		@Override
		public boolean isQuickFixableStateSet() {
			return fIsQuickFixableStateSet;
		}

		/**
		 * {@inheritDoc}
		 *
		 */
		@Override
		public boolean isQuickFixable() {
			Assert.isTrue(isQuickFixableStateSet());
			return fIsQuickFixable;
		}

	}

	public void handleError(SpecfileParseException e) {

		int lineNumber = e.getLineNumber();
		int lineOffset = 0;
		try {
			lineOffset = document.getLineOffset(lineNumber);
		} catch (BadLocationException e2) {
			// do nothing
		}

		int charStart = lineOffset + e.getStartColumn();
		int charEnd = lineOffset + e.getEndColumn();
		String annotationType = ANNOTATION_INFO;
		if (e.getSeverity() == IMarker.SEVERITY_ERROR) {
			annotationType = ANNOTATION_ERROR;
		} else if (e.getSeverity() == IMarker.SEVERITY_WARNING) {
			annotationType = ANNOTATION_WARNING;
		}
		Annotation annotation = new SpecfileAnnotation(annotationType, true, e.getLocalizedMessage());
		Position p = new Position(charStart, charEnd - charStart);
		if (fAnnotationModel != null) {
			fAnnotationModel.addAnnotation(annotation, p);
		}
		return;
	}

	public void removeAllExistingMarkers() {
		fAnnotationModel.removeAllAnnotations();
	}

	@Override
	public void removeExistingMarkers() {
		removeExistingMarkers(0, document.getLength());
	}

	private AnnotationModel getAnnotationModel() {
		return (AnnotationModel) SpecfileEditor.getSpecfileDocumentProvider().getAnnotationModel(input);
	}

	public void removeExistingMarkers(int offset, int length) {
		if (fAnnotationModel != null) {
			Iterator<Annotation> i = fAnnotationModel.getAnnotationIterator();
			while (i.hasNext()) {
				Annotation annotation = i.next();
				Position p = fAnnotationModel.getPosition(annotation);
				if (p != null) {
					int pStart = p.getOffset();
					if (pStart >= offset && pStart < (offset + length)) {
						// Remove directly from model instead of using
						// iterator so position will be removed from document.
						fAnnotationModel.removeAnnotation(annotation);
					}
				}
			}
		}
	}

	public SpecfileErrorHandler(IFile file, IDocument document) {
		this(new FileEditorInput(file), document);
	}

	@Override
	public void setFile(IFile file) {
		input = new FileEditorInput(file);
	}

	@Override
	String getMarkerID() {
		return SPECFILE_ERROR_MARKER_ID;
	}

}
