/*******************************************************************************
 * Copyright (c) 2012, 2017 NumberFour AG and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     NumberFour AG - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.internal.core;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.Assert;
import org.eclipse.dltk.annotations.Nullable;
import org.eclipse.dltk.core.ICodeSelection;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.utils.ArrayIterator;
import org.eclipse.dltk.utils.MultiArrayIterator;

/**
 * Default implementation of {@link ICodeSelection}.
 */
class CodeSelection implements ICodeSelection {

	@Nullable
	private final IModelElement[] modelElements;

	@Nullable
	private final Object[] foreignElements;

	@Nullable
	private final Map<Object, ISourceRange> ranges;

	public CodeSelection(IModelElement[] modelElements,
			Object[] foreignElements, Map<Object, ISourceRange> ranges) {
		Assert.isLegal(modelElements != null || foreignElements != null);
		if (modelElements != null) {
			Assert.isLegal(modelElements.length != 0);
		}
		if (foreignElements != null) {
			Assert.isLegal(foreignElements.length != 0);
		}
		this.modelElements = modelElements;
		this.foreignElements = foreignElements;
		this.ranges = ranges;
	}

	@Override
	public int size() {
		return (modelElements != null ? modelElements.length : 0)
				+ (foreignElements != null ? foreignElements.length : 0);
	}

	@Override
	public Object[] toArray() {
		if (modelElements != null && foreignElements == null) {
			return modelElements;
		} else if (modelElements == null && foreignElements != null) {
			return foreignElements;
		} else {
			final Object[] result = new Object[modelElements.length
					+ foreignElements.length];
			System.arraycopy(modelElements, 0, result, 0, modelElements.length);
			System.arraycopy(foreignElements, 0, result, modelElements.length,
					foreignElements.length);
			return result;
		}
	}

	@Override
	public List<Object> toList() {
		if (modelElements != null && foreignElements == null) {
			return Arrays.asList((Object[]) modelElements);
		} else if (modelElements == null && foreignElements != null) {
			return Arrays.asList(foreignElements);
		} else {
			final List<Object> result = new ArrayList<>(
					modelElements.length + foreignElements.length);
			Collections.addAll(result, modelElements);
			Collections.addAll(result, foreignElements);
			return result;
		}
	}

	@Override
	public Iterator<Object> iterator() {
		if (modelElements != null && foreignElements == null) {
			return new ArrayIterator<>(modelElements);
		} else if (modelElements == null && foreignElements != null) {
			return new ArrayIterator<>(foreignElements);
		} else {
			return new MultiArrayIterator<>(modelElements,
					foreignElements);
		}
	}

	@Override
	public List<IModelElement> getModelElements() {
		return modelElements != null ? Arrays.asList(modelElements)
				: Collections.<IModelElement> emptyList();
	}

	@Override
	public ISourceRange rangeOf(Object element) {
		return ranges != null ? ranges.get(element) : null;
	}

}
