/*******************************************************************************
 * Copyright (c) 2010 xored software, Inc.
 *
 * 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:
 *     xored software, Inc. - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.javascript.parser;

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

import org.eclipse.dltk.javascript.ast.DecimalLiteral;
import org.eclipse.dltk.javascript.ast.Expression;
import org.eclipse.dltk.javascript.ast.FunctionStatement;
import org.eclipse.dltk.javascript.ast.Identifier;
import org.eclipse.dltk.javascript.ast.PropertyExpression;
import org.eclipse.dltk.javascript.ast.StringLiteral;

public class PropertyExpressionUtils {

	public static String getPath(Expression expression) {
		final StringBuilder buffer = new StringBuilder();
		if (buildPath(buffer, expression)) {
			return buffer.toString();
		} else {
			return null;
		}
	}

	public static Identifier getIdentifier(Expression expression) {
		if (expression instanceof Identifier) {
			return (Identifier) expression;
		} else if (expression instanceof PropertyExpression) {
			final PropertyExpression propertyExpression = (PropertyExpression) expression;

			Identifier identifier = getIdentifier(propertyExpression
					.getObject());
			if (identifier != null)
				return identifier;
			return getIdentifier(propertyExpression.getProperty());
		} else if (expression instanceof FunctionStatement) {
			final FunctionStatement functionStatement = (FunctionStatement) expression;
			return getIdentifier(functionStatement.getName());
		}
		return null;
	}

	private static boolean buildPath(StringBuilder buffer, Expression expression) {
		if (expression instanceof Identifier) {
			buffer.append(((Identifier) expression).getName());
			return true;
		} else if (expression instanceof PropertyExpression) {
			final PropertyExpression propertyExpression = (PropertyExpression) expression;
			if (!buildPath(buffer, propertyExpression.getObject()))
				return false;
			buffer.append('.');
			if (!buildPath(buffer, propertyExpression.getProperty()))
				return false;
			return true;
		} else if (expression instanceof FunctionStatement) {
			final FunctionStatement functionStatement = (FunctionStatement) expression;
			if (!buildPath(buffer, functionStatement.getName()))
				return false;
			return true;
		} else {
			return false;
		}
	}

	public static boolean equals(Expression expression,
			String... expressionPath) {
		int endIndex = expressionPath.length;
		if (endIndex <= 0) {
			return false;
		}
		for (;;) {
			--endIndex;
			if (endIndex == 0) {
				return expression instanceof Identifier
						&& expressionPath[endIndex]
								.equals(((Identifier) expression).getName());
			} else if (expression instanceof PropertyExpression) {
				final PropertyExpression pe = (PropertyExpression) expression;
				if (pe.getProperty() instanceof Identifier
						&& expressionPath[endIndex].equals(((Identifier) pe
								.getProperty()).getName())) {
					expression = pe.getObject();
				} else {
					return false;
				}
			} else {
				return false;
			}
		}
	}

	public static List<Identifier> getIdentifiers(PropertyExpression expression) {
		final List<Identifier> identifiers = new ArrayList<Identifier>();
		collectIdentifiers(expression, identifiers);
		return identifiers;
	}

	private static void collectIdentifiers(PropertyExpression expression,
			List<Identifier> identifiers) {
		if (expression.getObject() instanceof PropertyExpression) {
			collectIdentifiers((PropertyExpression) expression.getObject(),
					identifiers);
		} else if (expression.getObject() instanceof Identifier) {
			identifiers.add((Identifier) expression.getObject());
		}
		if (expression.getProperty() instanceof Identifier) {
			identifiers.add((Identifier) expression.getProperty());
		}
	}

	public static String nameOf(Expression name) {
		if (name instanceof Identifier) {
			return ((Identifier) name).getName();
		} else if (name instanceof StringLiteral) {
			return ((StringLiteral) name).getValue();
		} else if (name instanceof DecimalLiteral) {
			return ((DecimalLiteral) name).getText();
		} else {
			return null;
		}
	}

}
