/*=============================================================================#
 # Copyright (c) 2009, 2019 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.core.model;

import java.util.List;

import org.eclipse.core.runtime.IProgressMonitor;

import org.eclipse.statet.docmlet.wikitext.core.ast.Embedded;
import org.eclipse.statet.docmlet.wikitext.core.ast.WikitextAstInfo;
import org.eclipse.statet.docmlet.wikitext.core.markup.WikitextMarkupLanguage;
import org.eclipse.statet.docmlet.wikitext.core.model.EmbeddingReconcileItem;
import org.eclipse.statet.docmlet.wikitext.core.model.IWikidocModelInfo;
import org.eclipse.statet.docmlet.wikitext.core.model.IWikidocSuModelContainerEmbeddedExtension;
import org.eclipse.statet.docmlet.wikitext.core.model.WikidocSuModelContainer;
import org.eclipse.statet.docmlet.wikitext.core.model.WikitextModel;
import org.eclipse.statet.internal.redocs.wikitext.r.RedocsWikitextRPlugin;
import org.eclipse.statet.ltk.core.LTK;
import org.eclipse.statet.ltk.core.SourceContent;
import org.eclipse.statet.ltk.issues.core.ProblemRequestor;
import org.eclipse.statet.r.core.model.RModel;
import org.eclipse.statet.redocs.wikitext.r.core.model.WikidocRweaveSourceUnit;
import org.eclipse.statet.redocs.wikitext.r.core.model.WikitextRweaveModel;
import org.eclipse.statet.redocs.wikitext.r.core.source.RweaveMarkupLanguage;


public class WikidocRweaveSuModelContainer extends WikidocSuModelContainer<WikidocRweaveSourceUnit>
		implements IWikidocSuModelContainerEmbeddedExtension {
	
	
	public WikidocRweaveSuModelContainer(final WikidocRweaveSourceUnit su) {
		super(su);
	}
	
	
	@Override
	public boolean isContainerFor(final String modelTypeId) {
		return (modelTypeId == WikitextModel.WIKIDOC_TYPE_ID || modelTypeId == WikitextRweaveModel.WIKIDOC_R_MODEL_TYPE_ID);
	}
	
	public String getNowebType() {
		return RModel.R_TYPE_ID;
	}
	
	
	@Override
	public void reconcileEmbeddedAst(final SourceContent content, final List<Embedded> list,
			final WikitextMarkupLanguage markupLanguage, final int level,
			final IProgressMonitor monitor) {
		if (markupLanguage instanceof RweaveMarkupLanguage) {
			WikidocRChunkReconciler.getInstance((RweaveMarkupLanguage) markupLanguage)
					.reconcileAst(this, content, list, monitor);
		}
	}
	
	@Override
	public void reconcileEmbeddedModel(final SourceContent content, final IWikidocModelInfo wikitextModel,
			final List<EmbeddingReconcileItem> list,
			final int level, final IProgressMonitor monitor) {
		final WikitextAstInfo astInfo= wikitextModel.getAst();
		final WikitextMarkupLanguage markupLanguage= astInfo.getMarkupLanguage();
		if (markupLanguage instanceof RweaveMarkupLanguage) {
			WikidocRChunkReconciler.getInstance((RweaveMarkupLanguage) markupLanguage)
					.reconcileModel(this, content, wikitextModel, list, level, monitor);
		}
	}
	
	@Override
	public void reportEmbeddedProblems(final SourceContent content, final IWikidocModelInfo wikitextModel,
			final ProblemRequestor problemRequestor, final int level,
			final IProgressMonitor monitor) {
		final WikitextAstInfo astInfo= wikitextModel.getAst();
		final WikitextMarkupLanguage markupLanguage= astInfo.getMarkupLanguage();
		if (markupLanguage instanceof RweaveMarkupLanguage) {
			WikidocRChunkReconciler.getInstance((RweaveMarkupLanguage) markupLanguage)
					.reportEmbeddedProblems(this, content, wikitextModel, problemRequestor, level, monitor);
		}
	}
	
	@Override
	public ProblemRequestor createProblemRequestor() {
		if (getMode() == LTK.EDITOR_CONTEXT) {
			return RedocsWikitextRPlugin.getInstance().getDocRDocumentProvider().createProblemRequestor(
					getSourceUnit() );
		}
		return null;
	}
	
}
