/*******************************************************************************
 * 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
 *
 *******************************************************************************/
package org.eclipse.dltk.internal.core;

import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IField;
import org.eclipse.dltk.core.IMember;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.INamespace;
import org.eclipse.dltk.core.IScriptFolder;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;

public abstract class NamedMember extends Member {
	/*
	 * This element's name, or an empty <code>String</code> if this element does
	 * not have a name.
	 */
	protected String name;

	public NamedMember(ModelElement parent, String name) {
		super(parent);
		this.name = name;
	}

	@Override
	public String getElementName() {
		return this.name;
	}

	protected IScriptFolder getScriptFolder() {
		return null;
	}

	public String getFullyQualifiedName(String enclosingTypeSeparator,
			boolean showParameters) throws ModelException {
		INamespace namespace = getNamespace();
		if (namespace != null && !namespace.isRoot()) {
			return namespace.getQualifiedName(enclosingTypeSeparator)
					+ enclosingTypeSeparator
					+ getTypeQualifiedName(enclosingTypeSeparator,
							showParameters);
		}
		return getTypeQualifiedName(enclosingTypeSeparator, showParameters);
	}

	public String getTypeQualifiedName(String typeSeparator,
			boolean showParameters) throws ModelException {
		NamedMember declaringType;
		String thisName = this.name;
		if (thisName.startsWith(typeSeparator))
			return thisName;
		switch (this.parent.getElementType()) {
		case IModelElement.SOURCE_MODULE:
			// thisName = /*typeSeparator + */thisName;
			if (showParameters) {
				StringBuffer buffer = new StringBuffer(thisName);
				// appendTypeParameters(buffer);
				if (DLTKCore.DEBUG) {
					System.err
							.println("TODO: NamedMember: add type parameters"); //$NON-NLS-1$
				}
				return buffer.toString();
			}
			return thisName;
		case IModelElement.TYPE:
			declaringType = (NamedMember) this.parent;
			break;
		case IModelElement.FIELD:
		case IModelElement.METHOD:
			declaringType = (NamedMember) ((IMember) this.parent)
					.getDeclaringType();
			break;
		default:
			return null;
		}
		String declTName = ""; //$NON-NLS-1$
		if (declaringType != null) {
			declTName = declaringType.getTypeQualifiedName(typeSeparator,
					showParameters);
		}
		StringBuffer buffer = new StringBuffer(declTName);
		buffer.append(typeSeparator);
		String simpleName = this.name.length() == 0 ? Integer
				.toString(this.occurrenceCount) : this.name;
		buffer.append(simpleName);
		if (showParameters) {
			// appendTypeParameters(buffer);
			if (DLTKCore.DEBUG) {
				System.err.println("TODO: NamedMember: Add type parameters."); //$NON-NLS-1$
			}
		}
		return buffer.toString();
	}

	protected String getKey(IField field, boolean forceOpen)
			throws ModelException {
		StringBuffer key = new StringBuffer();

		// declaring class
		String declaringKey = getKey((IType) field.getParent(), forceOpen);
		key.append(declaringKey);

		// field name
		key.append('.');
		key.append(field.getElementName());

		return key.toString();
	}

	protected String getKey(IMethod method, boolean forceOpen)
			throws ModelException {
		StringBuffer key = new StringBuffer();

		// declaring class
		String declaringKey = getKey((IType) method.getParent(), forceOpen);
		key.append(declaringKey);

		// selector
		key.append('.');
		String selector = method.getElementName();
		key.append(selector);

		// type parameters

		// parameters
		key.append('(');
		String[] parameters = method.getParameterNames();
		for (int i = 0, length = parameters.length; i < length; i++)
			key.append(parameters[i].replace('.', '/'));
		key.append(')');

		// return type
		key.append('V');

		return key.toString();
	}

	protected String getKey(IType type, boolean forceOpen)
			throws ModelException {
		StringBuffer key = new StringBuffer();
		key.append('L');
		String packageName = type.getScriptFolder().getElementName();
		key.append(packageName.replace('.', '/'));
		if (packageName.length() > 0)
			key.append('/');
		String typeQualifiedName = type.getTypeQualifiedName("$"); //$NON-NLS-1$
		ISourceModule cu = (ISourceModule) type
				.getAncestor(IModelElement.SOURCE_MODULE);
		if (cu != null) {
			String cuName = cu.getElementName();
			String mainTypeName = cuName.substring(0, cuName.lastIndexOf('.'));
			int end = typeQualifiedName.indexOf('$');
			if (end == -1)
				end = typeQualifiedName.length();
			String topLevelTypeName = typeQualifiedName.substring(0, end);
			if (!mainTypeName.equals(topLevelTypeName)) {
				key.append(mainTypeName);
				key.append('~');
			}
		}
		key.append(typeQualifiedName);
		key.append(';');
		return key.toString();
	}
}
