/*******************************************************************************
 * Copyright (c) 2005, 2016 IBM Corporation 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:
 *     xored software, Inc. - initial API and Implementation (Andrei Sobolev)
 *     xored software, Inc. - RubyDocumentation display improvements (Alex Panchenko <alex@xored.com>)
 *******************************************************************************/
package org.eclipse.dltk.ruby.internal.parser.mixin;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.mixin.IMixinElement;
import org.eclipse.dltk.core.mixin.MixinModel;

public class RubyMixinMethod implements IRubyMixinElement {

	private final String key;
	protected final RubyMixinModel model;
	private IMethod[] sourceMethods;

	public RubyMixinMethod(RubyMixinModel model, String key) {
		super();
		this.model = model;
		this.key = key;
	}

	public String getName() {
		return key.substring(key.lastIndexOf(MixinModel.SEPARATOR) + 1);
	}

	public RubyMixinMethod(RubyMixinModel model, String key,
			IMethod[] sourceMethods) {
		super();
		this.model = model;
		this.key = key;
		this.sourceMethods = sourceMethods;
	}

	public String getKey() {
		return key;
	}

	public RubyMixinClass getSelfType() {
		IMixinElement mixinElement = model.getRawModel().get(key);
		IMixinElement parent = null;
		if (mixinElement != null)
			parent = mixinElement.getParent();
		if (parent == null)
			return new RubyObjectMixinClass(model, true);
		IRubyMixinElement rubyParent = model.createRubyElement(parent);
		if (rubyParent instanceof RubyMixinClass) {
			return (RubyMixinClass) rubyParent;
		}
		return null;
	}

	/**
	 * Allows to set precalculated source methods and not use mixin model to
	 * find them.
	 */
	public void setSourceMethods(IMethod[] sourceMethods) {
		this.sourceMethods = sourceMethods;
	}

	/**
	 * Returns model elements for this method. If they were previously saved
	 * using setSourceMethods() or constructor, then exactly they are returned.
	 * Else mixin model are used.
	 */
	public IMethod[] getSourceMethods() {
		if (this.sourceMethods != null)
			return sourceMethods;
		return RubyMixinMethod.getSourceMethods(model, key);
	}

	protected static IMethod[] getSourceMethods(RubyMixinModel model, String key) {
		final IMixinElement mixinElement = model.getRawModel().get(key);
		if (mixinElement != null) {
			final Object[] allObjects = mixinElement.getAllObjects();
			final List<IMethod> result = new ArrayList<IMethod>();
			for (int i = 0; i < allObjects.length; i++) {
				RubyMixinElementInfo info = (RubyMixinElementInfo) allObjects[i];
				if (info.getKind() == RubyMixinElementInfo.K_METHOD) {
					result.add((IMethod) info.getObject());
				}
			}
			return result.toArray(new IMethod[result.size()]);
		}
		return new IMethod[0];
	}

	public RubyMixinVariable[] getVariables() {
		List<RubyMixinVariable> result = new ArrayList<RubyMixinVariable>();
		IMixinElement mixinElement = model.getRawModel().get(key);
		IMixinElement[] children = mixinElement.getChildren();
		for (int i = 0; i < children.length; i++) {
			IRubyMixinElement element = model.createRubyElement(children[i]);
			if (element instanceof RubyMixinVariable)
				result.add((RubyMixinVariable) element);
		}
		return result
				.toArray(new RubyMixinVariable[result.size()]);
	}
	
	@Override
	public String toString() {
		return "RubyMixinMethod[" + key + "]"; //$NON-NLS-1$ //$NON-NLS-2$
	}

}
