/*=============================================================================#
 # 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.r.core.builder;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.eclipse.statet.jcommons.text.core.BasicTextRegion;
import org.eclipse.statet.jcommons.text.core.TextRegion;

import org.eclipse.statet.ltk.model.core.elements.IModelElement;
import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
import org.eclipse.statet.r.core.model.IRElement;
import org.eclipse.statet.r.core.model.IRLangElement;
import org.eclipse.statet.r.core.model.RElementName;
import org.eclipse.statet.r.core.model.RModel;


public class ExportedRElement implements IRLangElement, Serializable {
	
	
	private static final long serialVersionUID= -493469386405499748L;
	
	
	static final List<? extends IRLangElement> getChildren(final List<? extends IRLangElement> children, final IModelElement.Filter filter) {
		if (filter == null) {
			return children;
		}
		else {
			final ArrayList<IRLangElement> filtered= new ArrayList<>(children.size());
			for (final IRLangElement child : children) {
				if (filter.include(child)) {
					filtered.add(child);
				}
			}
			return filtered;
		}
	}
	
	static final boolean hasChildren(final List<? extends IRLangElement> children, final IModelElement.Filter filter) {
		if (filter == null) {
			return (!children.isEmpty());
		}
		else {
			for (final IRElement child : children) {
				if (filter.include(child)) {
					return true;
				}
			}
			return false;
		}
	}
	
	
	private IRLangElement parent;
	private int elementType;
	private RElementName elementName;
	private String elementId;
	
	private int sourceOffset;
	private int sourceLength;
	private int nameOffset;
	private int nameLength;
	
	
	public ExportedRElement(final IRLangElement parent, final IRLangElement sourceElement) {
		this.parent= parent;
		this.elementType= sourceElement.getElementType();
		this.elementName= RElementName.cloneName(sourceElement.getElementName(), false);
		this.elementId= sourceElement.getId();
		
		{	final TextRegion sourceRange= sourceElement.getSourceRange();
			if (sourceRange != null) {
				this.sourceOffset= sourceRange.getStartOffset();
				this.sourceLength= sourceRange.getLength();
			}
			else {
				this.sourceOffset= -1;
			}
		}
		{
			final TextRegion sourceRange= sourceElement.getNameSourceRange();
			if (sourceRange != null) {
				this.nameOffset= sourceRange.getStartOffset();
				this.nameLength= sourceRange.getLength();
			}
			else {
				this.nameOffset= -1;
			}
		}
	}
	
	public ExportedRElement() {
	}
	
	
	@Override
	public String getModelTypeId() {
		return RModel.R_TYPE_ID;
	}
	
	@Override
	public String getId() {
		return this.elementId;
	}
	
	@Override
	public int getElementType() {
		return this.elementType;
	}
	
	@Override
	public RElementName getElementName() {
		return this.elementName;
	}
	
	@Override
	public boolean exists() {
		return true;
	}
	
	@Override
	public boolean isReadOnly() {
		return false;
	}
	
	
	@Override
	public IRElement getModelParent() {
		return this.parent;
	}
	
	@Override
	public boolean hasModelChildren(final Filter filter) {
		return false;
	}
	
	@Override
	public List<? extends IRLangElement> getModelChildren(final Filter filter) {
		return Collections.EMPTY_LIST;
	}
	
	
	@Override
	public ISourceUnit getSourceUnit() {
		return this.parent.getSourceUnit();
	}
	
	@Override
	public TextRegion getSourceRange() {
		if (this.sourceOffset >= 0) {
			return new BasicTextRegion(this.sourceOffset, this.sourceOffset + this.sourceLength);
		}
		return null;
	}
	
	@Override
	public TextRegion getNameSourceRange() {
		if (this.nameOffset >= 0) {
			return new BasicTextRegion(this.nameOffset, this.nameOffset + this.nameLength);
		}
		return null;
	}
	
	@Override
	public TextRegion getDocumentationRange() {
		return null;
	}
	
	
	@Override
	public <T> T getAdapter(final Class<T> adapterType) {
		return null;
	}
	
}
