/*******************************************************************************
 * Copyright (c) 2015 Google Inc and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     John Glassmyer <jogl@google.com> - import group sorting is broken - https://bugs.eclipse.org/430303
 *******************************************************************************/
package org.aspectj.org.eclipse.jdt.internal.core.dom.rewrite.imports;

import org.aspectj.org.eclipse.jdt.core.Signature;
import org.aspectj.org.eclipse.jdt.core.dom.ImportDeclaration;

/**
 * Encapsulates an import's fully qualified name, whether it is on-demand, and whether it is static.
 * <p>
 * The fully qualified name is divided into two parts:
 * <ul>
 * <li>a container name, which is everything preceding the last dot ('.').
 * <li>a simple name, which is the part following the last dot ("*" for an on-demand import).
 * </ul>
 */
public final class ImportName {
	static ImportName createFor(ImportDeclaration importDeclaration) {
		String declName = importDeclaration.getName().getFullyQualifiedName();
		if (importDeclaration.isOnDemand()) {
			return createOnDemand(importDeclaration.isStatic(), declName);
		}
		return createFor(importDeclaration.isStatic(), declName);
	}

	static ImportName createOnDemand(boolean isStatic, String containerName) {
		return new ImportName(isStatic, containerName, "*"); //$NON-NLS-1$
	}

	public static ImportName createFor(boolean isStatic, String qualifiedName) {
		String containerName = Signature.getQualifier(qualifiedName);
		String simpleName = Signature.getSimpleName(qualifiedName);
		return new ImportName(isStatic, containerName, simpleName);
	}

	public final boolean isStatic;
	public final String containerName;
	public final String simpleName;
	public final String qualifiedName;

	private ImportName(boolean isStatic, String containerName, String simpleName) {
		this.isStatic = isStatic;
		this.containerName = containerName;
		this.simpleName = simpleName;

		this.qualifiedName = containerName.isEmpty() ? simpleName : containerName + "." + simpleName; //$NON-NLS-1$;
	}

	@Override
	public String toString() {
		String template = this.isStatic ? "staticImport(%s)" : "typeImport(%s)"; //$NON-NLS-1$ //$NON-NLS-2$
		return String.format(template, this.qualifiedName);
	}

	@Override
	public int hashCode() {
		int result = this.qualifiedName.hashCode();
		result = 31 * result + (this.isStatic ? 1 : 0);
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof ImportName)) {
			return false;
		}

		ImportName other = (ImportName) obj;

		return this.qualifiedName.equals(other.qualifiedName) && this.isStatic == other.isStatic;
	}

	public boolean isOnDemand() {
		return this.simpleName.equals("*"); //$NON-NLS-1$
	}

	/**
	 * Returns an on-demand ImportName with the same isStatic and containerName as this ImportName.
	 */
	ImportName getContainerOnDemand() {
		if (this.isOnDemand()) {
			return this;
		}

		return ImportName.createOnDemand(this.isStatic, this.containerName);
	}
}