/*******************************************************************************
 * Copyright (c) 2001, 2004 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 String[]{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;
	}

	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;
	}
}

