/*******************************************************************************
 * Copyright (c) 2012 NumberFour AG
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     NumberFour AG - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.internal.javascript.ti;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.eclipse.dltk.javascript.core.Types;
import org.eclipse.dltk.javascript.internal.core.RMethod;
import org.eclipse.dltk.javascript.internal.core.RParameter;
import org.eclipse.dltk.javascript.internal.core.TypeSystems;
import org.eclipse.dltk.javascript.typeinfo.IRFunctionType;
import org.eclipse.dltk.javascript.typeinfo.IRMethod;
import org.eclipse.dltk.javascript.typeinfo.IRParameter;
import org.eclipse.dltk.javascript.typeinfo.RTypes;
import org.eclipse.dltk.javascript.typeinfo.model.Method;
import org.eclipse.dltk.javascript.typeinfo.model.ParameterKind;

public enum FunctionMethod {
	apply {
		@Override
		List<IRParameter> buildParameters(IRFunctionType functionType) {
			return Arrays.<IRParameter> asList(
					new RParameter(FUNCTION_THIS_ARG, RTypes.any(),
							ParameterKind.OPTIONAL),
					new RParameter(FUNCTION_ARG_ARRAY, RTypes.arrayOf(
							TypeSystems.GLOBAL, RTypes.any()),
							ParameterKind.OPTIONAL));
		}
	},
	call {
		@Override
		List<IRParameter> buildParameters(IRFunctionType functionType) {
			final List<IRParameter> parameters = new ArrayList<IRParameter>(
					functionType.getParameters().size() + 1);
			parameters
					.add(new RParameter(
							FUNCTION_THIS_ARG,
							RTypes.any(),
							isAllOptionall(functionType.getParameters()) ? ParameterKind.OPTIONAL
									: ParameterKind.NORMAL));
			for (IRParameter param : functionType.getParameters()) {
				parameters.add(new RParameter(FUNCTION_ARG + parameters.size(),
						param.getType(), param.getKind()));
			}
			return parameters;
		}

		boolean isAllOptionall(Collection<IRParameter> parameters) {
			for (IRParameter param : parameters) {
				if (param.getKind() == ParameterKind.NORMAL) {
					return false;
				}
			}
			return true;
		}
	};

	private static final String FUNCTION_THIS_ARG = "thisArg";
	private static final String FUNCTION_ARG = "arg";
	private static final String FUNCTION_ARG_ARRAY = "argArray";

	public boolean test(String name) {
		return name().equals(name);
	}

	public IRMethod create(IRFunctionType functionType) {
		return new RMethod((Method) Types.FUNCTION.findDirectMember(name()),
				functionType.getReturnType(), buildParameters(functionType),
				RTypes.FUNCTION.getDeclaration());
	}

	abstract List<IRParameter> buildParameters(IRFunctionType functionType);

}
