/*******************************************************************************
 * Copyright (c) 2001, 2005 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
 *
 * Contributors:
 * IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal;

import java.text.MessageFormat;

import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jst.j2ee.internal.common.XMLResource;


/**
 * @author DABERG
 *
 */
public class J2EEStatus implements J2EESpecificationConstants { 
    
	public static final int COMPLETED_OK = 0;
	public static final int NOT_NEEDED = 1;
	public static final int NOT_POSSIBLE = 2;
	public static final int WARNING = 3;
	public static final int ERROR = 4; 

    public static final J2EEStatus OK_STATUS = new J2EEStatus(COMPLETED_OK, ""); //$NON-NLS-1$

	private static final J2EEStatus[] EmptyStatusArray = new J2EEStatus[0];

	private int severity;
	private String message;
	private XMLResource resource;
	private EObject targetObject;
	
	public J2EEStatus() {
		//Default
	}

	public J2EEStatus(int aSeverity, String aMessage) {
		this(aSeverity, (EObject)null, aMessage);
	}
	public J2EEStatus(int aSeverity, XMLResource xmlResource) {
		this(aSeverity, xmlResource, null);
	}
	
	public J2EEStatus(int aSeverity, EObject anObject) {
		this(aSeverity, anObject, null);
	}

	public J2EEStatus(int aSeverity, XMLResource xmlResource, String aMessage) {
		severity = aSeverity;
		resource = xmlResource;
		message = aMessage;
	}
	
	public J2EEStatus(int aSeverity, EObject anObject, String aMessage) {
		severity = aSeverity;
		targetObject = anObject;
		message = aMessage;
	}
	
	public String format(String aPattern, String arg1) {
		return MessageFormat.format(aPattern, new Object[]{arg1});
	}
	
	/**
	 * Returns the message.
	 * @return String
	 */
	public String getMessage() {
		if (message == null)
			message = createDefaultMessage();
		return message;
	}
	
	public String getMessageForDisplay() {
		return getSeverityText()+" "+getMessage(); //$NON-NLS-1$
	}
	
	protected String getSeverityText() {
		switch (severity) {
			case ERROR:
				return ERROR_TEXT;
			case WARNING:
				return WARNING_TEXT;
			case NOT_NEEDED:
			case NOT_POSSIBLE:
				return INFO_TEXT;
			default:
				return ""; //$NON-NLS-1$
		}
	}

	/**
	 * Method createDefaultMessage.
	 * @return String
	 */
	private String createDefaultMessage() {
		String objDesc;
		if (getResource() != null)
			objDesc = getResource().getURI().toString();
		else if (getTargetObject() != null && getTargetObject() instanceof ENamedElement)
			objDesc = ((ENamedElement) getTargetObject()).getName();
		else
			return null;
		switch (getSeverity()) {
			case COMPLETED_OK :
				return format(DEFAULT_COMPLETED_STATUS_MSG, objDesc);
			case NOT_NEEDED :
				return format(DEFAULT_NOT_NEEDED_STATUS_MSG, objDesc);
			case NOT_POSSIBLE :
				return format(DEFAULT_NOT_POSSIBLE_STATUS_MSG, objDesc);
			case ERROR :
				return format(DEFAULT_ERROR_STATUS_MSG, objDesc);
		}
		return null;
	}


	/**
	 * Sets the message.
	 * @param message The message to set
	 */
	public void setMessage(String message) {
		this.message = message;
	}

	/**
	 * The migration was completed fine or was not needed.
	 */
	public boolean isOK() {
		return severity == COMPLETED_OK || severity == NOT_NEEDED;
	}

	/**
	 * An error ocurred during migration.
	 */
	public boolean isError() {
		return severity == ERROR;
	}
	
	/**
	 * A warning ocurred during migration.
	 */
	public boolean isWarning() {
		return severity == WARNING;
	}

	/**
	 * The migration was not required.
	 */
	public boolean isNotNeeded() {
		return severity == NOT_NEEDED;
	}
	/**
	 * The migration was not possible.
	 */
	public boolean isNotPossible() {
		return severity == NOT_POSSIBLE;
	}
	/**
	 * Returns the severity.
	 * @return int
	 */
	public int getSeverity() {
		return severity;
	}

	/**
	 * Sets the severity.
	 * @param severity The severity to set
	 */
	public void setSeverity(int severity) {
		this.severity = severity;
	}

	public J2EEStatus[] getChildren() {
		return EmptyStatusArray;
	}

	public boolean isMultiStatus() {
		return false;
	}
	public XMLResource getResource() {
		return resource;
	}
	public EObject getTargetObject() {
		return targetObject;
	}

	@Override
	public String toString() {
		StringBuffer buf = new StringBuffer();
		buf.append("MigrationStatus "); //$NON-NLS-1$
		if (severity == COMPLETED_OK) {
			buf.append("Completed OK"); //$NON-NLS-1$
		} else if (severity == ERROR) {
			buf.append("ERROR"); //$NON-NLS-1$
		} else if (severity == WARNING) {
			buf.append("WARNING"); //$NON-NLS-1$
		} else if (severity == NOT_NEEDED) {
			buf.append("Not Needed"); //$NON-NLS-1$
		} else if (severity == NOT_POSSIBLE) {
			buf.append("Not Possible"); //$NON-NLS-1$
		} else {
			buf.append("severity="); //$NON-NLS-1$
			buf.append(severity);
		}
		buf.append(' ');
		buf.append(message);
		return buf.toString();
	}
	
	/**
	 * Append the paramater to this status, and return the resultant status;
	 * clients must be careful to set their cached status to the return value, 
	 * as it may be a new instance.
	 */
	public J2EEStatus append(J2EEStatus aStatus) {
		if (aStatus == null)
			return this;
		J2EEMultiStatus multi = new J2EEMultiStatus();
		multi.merge(this);
		multi.merge(aStatus);
		return multi;
	}
}

