/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring;

import org.eclipse.core.runtime.Assert;

import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeParameter;
import org.eclipse.jdt.core.dom.ITypeBinding;


public class ExceptionInfo {
	private final IJavaElement fElement;
	private final ITypeBinding fTypeBinding;
	private int fKind;

	public static final int OLD= 0;
	public static final int ADDED= 1;
	public static final int DELETED= 2;

	public ExceptionInfo(IJavaElement element, int kind, ITypeBinding binding) {
		Assert.isNotNull(element);
		Assert.isTrue(element instanceof IType || element instanceof ITypeParameter);
		fElement= element;
		fKind= kind;
		fTypeBinding= binding;
	}

	public static ExceptionInfo createInfoForOldException(IJavaElement element, ITypeBinding binding){
		return new ExceptionInfo(element, OLD, binding);
	}
	public static ExceptionInfo createInfoForAddedException(IType type){
		return new ExceptionInfo(type, ADDED, null);
	}

	public void markAsDeleted(){
		Assert.isTrue(! isAdded());//added exception infos should be simply removed from the list
		fKind= DELETED;
	}

	public void markAsOld(){
		Assert.isTrue(isDeleted());
		fKind= OLD;
	}

	public boolean isAdded(){
		return fKind == ADDED;
	}

	public boolean isDeleted(){
		return fKind == DELETED;
	}

	public boolean isOld(){
		return fKind == OLD;
	}

	public IJavaElement getElement() {
		return fElement;
	}

	public String getFullyQualifiedName() {
		return fElement instanceof IType ? ((IType) fElement).getFullyQualifiedName('.') : fElement.getElementName();
	}

	public int getKind() {
		return fKind;
	}

	/**
	 * @return ITypeBinding the typeBinding (for OLD and DELETED exceptions) or <code>null</code>
	 */
	public ITypeBinding getTypeBinding() {
		return fTypeBinding;
	}

	@Override
	public String toString() {
		StringBuilder result= new StringBuilder();
		switch (fKind) {
			case OLD : result.append("OLD: "); break; //$NON-NLS-1$
			case ADDED : result.append("ADDED: "); break; //$NON-NLS-1$
			case DELETED : result.append("DELETED: "); break; //$NON-NLS-1$
		}
		if (fElement == null)
			result.append("null"); //$NON-NLS-1$
		else
			result.append(fElement.toString());
		return result.toString();
	}
}
