/*=============================================================================#
 # Copyright (c) 2007, 2020 Stephan Wahlbrink and others.
 # 
 # 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, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.internal.redocs.wikitext.r.ui.editors;

import java.util.List;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.text.source.IAnnotationModel;

import org.eclipse.statet.jcommons.lang.Disposable;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;

import org.eclipse.statet.ecommons.preferences.PreferencesUtil;
import org.eclipse.statet.ecommons.preferences.SettingsChangeNotifier;
import org.eclipse.statet.ecommons.preferences.core.PreferenceAccess;
import org.eclipse.statet.ecommons.preferences.core.util.PreferenceUtils;

import org.eclipse.statet.docmlet.wikitext.core.model.WikitextModel;
import org.eclipse.statet.docmlet.wikitext.ui.editors.WikitextEditorBuild;
import org.eclipse.statet.ltk.core.Ltk;
import org.eclipse.statet.ltk.issues.core.Problem;
import org.eclipse.statet.ltk.issues.core.ProblemRequestor;
import org.eclipse.statet.ltk.model.core.LtkModels;
import org.eclipse.statet.ltk.model.core.element.SourceUnit;
import org.eclipse.statet.ltk.ui.sourceediting.SourceAnnotationModel;
import org.eclipse.statet.ltk.ui.sourceediting.SourceDocumentProvider;
import org.eclipse.statet.ltk.ui.sourceediting.SourceProblemAnnotation;
import org.eclipse.statet.r.core.model.RModel;
import org.eclipse.statet.r.ui.editors.REditorBuild;
import org.eclipse.statet.redocs.wikitext.r.core.model.WikidocRweaveSourceUnit;
import org.eclipse.statet.redocs.wikitext.r.core.model.WikitextRweaveModel;
import org.eclipse.statet.yaml.core.model.YamlModel;
import org.eclipse.statet.yaml.ui.editors.YamlEditorBuild;


@NonNullByDefault
public class WikidocRweaveDocumentProvider extends SourceDocumentProvider<WikidocRweaveSourceUnit>
		implements Disposable {
	
	
	private class ThisAnnotationModel extends SourceAnnotationModel {
		
		
		private class ThisProblemRequestor extends SourceAnnotationProblemRequestor {
			
			
			private final boolean handleTemporaryRProblems;
			
			
			public ThisProblemRequestor() {
				this.handleTemporaryRProblems= isHandlingTemporaryRProblems();
			}
			
			
			@Override
			public void acceptProblems(final Problem problem) {
				if (problem.getCategoryId() == RModel.R_TYPE_ID) {
					if (this.handleTemporaryRProblems) {
						this.reportedProblems.add(problem);
					}
				}
				else {
					if (this.handleTemporaryProblems) {
						this.reportedProblems.add(problem);
					}
				}
			}
			
			@Override
			public void acceptProblems(final String modelTypeId, final List<Problem> problems) {
				if (modelTypeId == RModel.R_TYPE_ID) {
					if (this.handleTemporaryRProblems) {
						this.reportedProblems.addAll(problems);
					}
				}
				else {
					if (this.handleTemporaryProblems) {
						this.reportedProblems.addAll(problems);
					}
				}
			}
			
		}
		
		
		public ThisAnnotationModel(final IResource resource) {
			super(resource);
		}
		
		@Override
		protected boolean isHandlingTemporaryProblems() {
			return WikidocRweaveDocumentProvider.this.handleTemporaryDocProblems;
		}
		
		protected boolean isHandlingTemporaryRProblems() {
			return WikidocRweaveDocumentProvider.this.handleTemporaryRProblems;
		}
		
		@Override
		protected ProblemRequestor doCreateProblemRequestor() {
			return new ThisProblemRequestor();
		}
		
		@Override
		protected @Nullable SourceProblemAnnotation createAnnotation(final Problem problem) {
			if (problem.getCategoryId() == RModel.R_TYPE_ID) {
				switch (problem.getSeverity()) {
				case Problem.SEVERITY_ERROR:
					return new SourceProblemAnnotation(REditorBuild.ERROR_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.ERROR_CONFIG );
				case Problem.SEVERITY_WARNING:
					return new SourceProblemAnnotation(REditorBuild.WARNING_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.WARNING_CONFIG );
				default:
					return new SourceProblemAnnotation(REditorBuild.INFO_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.INFO_CONFIG );
				}
			}
			else if (problem.getCategoryId() == WikitextModel.WIKIDOC_TYPE_ID) {
				switch (problem.getSeverity()) {
				case Problem.SEVERITY_ERROR:
					return new SourceProblemAnnotation(WikitextEditorBuild.ERROR_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.ERROR_CONFIG );
				case Problem.SEVERITY_WARNING:
					return new SourceProblemAnnotation(WikitextEditorBuild.WARNING_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.WARNING_CONFIG );
				default:
					return new SourceProblemAnnotation(WikitextEditorBuild.INFO_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.INFO_CONFIG );
				}
			}
			else if (problem.getCategoryId() == YamlModel.YAML_TYPE_ID) {
				switch (problem.getSeverity()) {
				case Problem.SEVERITY_ERROR:
					return new SourceProblemAnnotation(YamlEditorBuild.ERROR_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.ERROR_CONFIG );
				case Problem.SEVERITY_WARNING:
					return new SourceProblemAnnotation(YamlEditorBuild.WARNING_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.WARNING_CONFIG );
				default:
					return new SourceProblemAnnotation(YamlEditorBuild.INFO_ANNOTATION_TYPE, problem,
							SourceProblemAnnotation.INFO_CONFIG );
				}
			}
			return null;
		}
		
	}
	
	
	private SettingsChangeNotifier. @Nullable ChangeListener editorPrefListener;
	
	private boolean handleTemporaryDocProblems;
	private boolean handleTemporaryRProblems;
	
	
	public WikidocRweaveDocumentProvider() {
		super(WikitextRweaveModel.WIKIDOC_R_MODEL_TYPE_ID, null);
		
		this.editorPrefListener= new SettingsChangeNotifier.ChangeListener() {
			@Override
			public void settingsChanged(final Set<String> groupIds) {
				if (groupIds.contains(REditorBuild.GROUP_ID)
						|| groupIds.contains(WikitextEditorBuild.GROUP_ID)) {
					updateEditorPrefs();
				}
			}
		};
		PreferencesUtil.getSettingsChangeNotifier().addChangeListener(this.editorPrefListener);
		final PreferenceAccess access= PreferenceUtils.getInstancePrefs();
		this.handleTemporaryDocProblems= access.getPreferenceValue(WikitextEditorBuild.PROBLEMCHECKING_ENABLED_PREF);
		this.handleTemporaryRProblems= access.getPreferenceValue(REditorBuild.PROBLEMCHECKING_ENABLED_PREF);
	}
	
	@Override
	public void dispose() {
		if (this.editorPrefListener != null) {
			PreferencesUtil.getSettingsChangeNotifier().removeChangeListener(this.editorPrefListener);
			this.editorPrefListener= null;
		}
	}
	
	private void updateEditorPrefs() {
		final PreferenceAccess access= PreferenceUtils.getInstancePrefs();
		final boolean newHandleTemporaryDocProblems= access.getPreferenceValue(WikitextEditorBuild.PROBLEMCHECKING_ENABLED_PREF);
		final boolean newHandleTemporaryRProblems= access.getPreferenceValue(REditorBuild.PROBLEMCHECKING_ENABLED_PREF);
		if (this.handleTemporaryDocProblems != newHandleTemporaryDocProblems
				|| this.handleTemporaryRProblems != newHandleTemporaryRProblems ) {
			final boolean enabled= ((this.handleTemporaryDocProblems != newHandleTemporaryDocProblems) ? newHandleTemporaryDocProblems : false)
					|| ((this.handleTemporaryRProblems != newHandleTemporaryRProblems) ? newHandleTemporaryRProblems : false);
			this.handleTemporaryDocProblems= newHandleTemporaryRProblems;
			this.handleTemporaryRProblems= newHandleTemporaryRProblems;
			if (enabled) {
				WikitextModel.getWikidocModelManager().refresh(Ltk.EDITOR_CONTEXT);
			}
			else {
				final String mode;
				if (!this.handleTemporaryDocProblems) {
					if (!this.handleTemporaryRProblems) {
						mode= null;
					}
					else {
						mode= WikitextModel.WIKIDOC_TYPE_ID;
					}
				}
				else {
					mode= RModel.R_TYPE_ID;
				}
				final List<? extends SourceUnit> sus= LtkModels.getSourceUnitManager().getOpenSourceUnits(
						RModel.R_TYPE_ID, Ltk.EDITOR_CONTEXT );
				for (final SourceUnit su : sus) {
					final IAnnotationModel model= getAnnotationModel(su);
					if (model instanceof ThisAnnotationModel) {
						((ThisAnnotationModel) model).clearProblems(mode);
					}
				}
			}
		}
	}
	
	@Override
	protected IAnnotationModel createAnnotationModel(final IFile file) {
		return new ThisAnnotationModel(file);
	}
	
}
