/*=============================================================================#
 # 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.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;

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

import org.eclipse.statet.ltk.core.ElementName;
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.IRFrame;
import org.eclipse.statet.r.core.model.IRLangElement;
import org.eclipse.statet.r.core.model.IRSourceUnit;
import org.eclipse.statet.r.core.model.RElementName;
import org.eclipse.statet.r.core.model.RModel;


public class RUnitElement implements IRLangElement, Serializable {
	
	
	private static final long serialVersionUID= 2909953007129363256L;
	
	
	public static RUnitElement read(final IRSourceUnit su, final CompositeFrame envir, final InputStream input) throws IOException, ClassNotFoundException {
		final ObjectInputStream o= new ObjectInputStream(input);
		final RUnitElement element= (RUnitElement) o.readObject();
		element.sourceUnit= su;
		element.envir= envir;
		return element;
	}
	
	
	private transient ISourceUnit sourceUnit;
	transient CompositeFrame envir;
	private List<IRLangElement> elements;
	
	
	public RUnitElement(final IRSourceUnit su, final List<IRLangElement> children) {
		this.sourceUnit= su;
		this.elements= Collections.unmodifiableList(children);
	}
	
	/** For serialization */
	public RUnitElement() {
	}
	
	
	@Override
	public String getModelTypeId() {
		return RModel.R_TYPE_ID;
	}
	
	@Override
	public int getElementType() {
		return IModelElement.C2_SOURCE_FILE;
	}
	
	@Override
	public RElementName getElementName() {
		final ElementName elementName= this.sourceUnit.getElementName();
		if (elementName instanceof RElementName) {
			return (RElementName) elementName;
		}
		return RElementName.create(RElementName.RESOURCE, elementName.getSegmentName());
	}
	
	@Override
	public String getId() {
		return this.sourceUnit.getId();
	}
	
	@Override
	public boolean exists() {
		return true;
	}
	
	@Override
	public boolean isReadOnly() {
		return this.sourceUnit.isReadOnly();
	}
	
	@Override
	public ISourceUnit getSourceUnit() {
		return this.sourceUnit;
	}
	
	@Override
	public IRElement getModelParent() {
		return null;
	}
	
	@Override
	public boolean hasModelChildren(final Filter filter) {
		return ExportedRElement.hasChildren(this.elements, filter);
	}
	
	@Override
	public List<? extends IRLangElement> getModelChildren(final Filter filter) {
		return ExportedRElement.getChildren(this.elements, filter);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public <T> T getAdapter(final Class<T> adapterType) {
		if (adapterType == IRFrame.class) {
			return (T) this.envir;
		}
		return null;
	}
	
	
	public void save(final OutputStream outputStream) throws IOException {
		final ObjectOutputStream o= new ObjectOutputStream(outputStream);
		o.writeObject(this);
		o.flush();
	}
	
	
	@Override
	public TextRegion getSourceRange() {
		return null;
	}
	
	@Override
	public TextRegion getNameSourceRange() {
		return null;
	}
	
	@Override
	public TextRegion getDocumentationRange() {
		return null;
	}
	
}
