/*******************************************************************************
 * Copyright (c) 2010 The Eclipse Foundation 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:
 * 	The Eclipse Foundation - initial API and implementation
 *******************************************************************************/
package org.eclipse.epp.internal.mpc.core;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import org.apache.http.ConnectionClosedException;
import org.apache.http.NoHttpResponseException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;

/**
 * @author David Green
 */
public class MarketplaceClientCore {

	public static final String BUNDLE_ID = "org.eclipse.epp.mpc.core"; //$NON-NLS-1$

	private static final String STREAM_CLOSED_MESSAGE = "Stream closed"; //$NON-NLS-1$

	private static final String PIPE_CLOSED_MESSAGE = "Pipe closed"; //$NON-NLS-1$

	private static final String PIPE_BROKEN_MESSAGE = "Pipe broken"; //$NON-NLS-1$

	public static ILog getLog() {
		return Platform.getLog(MarketplaceClientCorePlugin.getBundle());
	}

	public static void error(String message, Throwable exception) {
		if (message == null) {
			message = NLS.bind(Messages.MarketplaceClientCore_unexpectedException, exception.getMessage());
		}
		IStatus status;
		if (exception != null) {
			status = computeStatus(exception, message);
		} else {
			status = new Status(IStatus.ERROR, BUNDLE_ID, IStatus.ERROR, message, exception);
		}
		getLog().log(status);
	}

	public static void error(Throwable exception) {
		error(null, exception);
	}

	public static IStatus computeStatus(Throwable e, String message) {
		Throwable cause = e;
		if (e instanceof InvocationTargetException) {
			cause = e.getCause();
		}
		IStatus statusCause = computeWellknownProblemStatus(e);
		if (statusCause == null) {
			if (cause instanceof CoreException) {
				statusCause = ((CoreException) cause).getStatus();
			} else {
				statusCause = new Status(IStatus.ERROR, BUNDLE_ID, cause.getMessage(), cause);
			}
		}
		if (message == null || "".equals(message.trim())) { //$NON-NLS-1$
			message = statusCause.getMessage();
		} else if (statusCause.getMessage() != null && !"".equals(statusCause.getMessage().trim())) { //$NON-NLS-1$
			message = NLS.bind(Messages.MarketplaceClientCore_message_message2, message, statusCause.getMessage());
		}
		IStatus status = new MultiStatus(BUNDLE_ID, 0, new IStatus[] { statusCause }, message, cause);
		return status;
	}

	public static IStatus computeWellknownProblemStatus(Throwable exception) {
		IStatus status = null;
		while (exception != null) {
			if (exception instanceof FileNotFoundException) {
				// exception message is the URL
				status = new Status(IStatus.ERROR, BUNDLE_ID,
						NLS.bind(Messages.MarketplaceClientCore_notFound, exception.getMessage()), exception);
				break;
			}
			// name resolution didn't work - possibly offline...
			if (exception instanceof UnknownHostException) {
				status = new Status(IStatus.ERROR, BUNDLE_ID,
						NLS.bind(Messages.MarketplaceClientCore_unknownHost, exception.getMessage()), exception);
				break;
			}
			// could be a previously resolved name, but now unreachable because we're offline...
			if (exception instanceof NoRouteToHostException) {
				status = new Status(IStatus.ERROR, BUNDLE_ID,
						NLS.bind(Messages.MarketplaceClientCore_unknownHost, exception.getMessage()), exception);
				break;
			}
			// some oddly configured networks throw timeouts instead of DNS or routing errors
			if (exception instanceof ConnectException) {
				status = createConnectionProblemStatus(exception);
				break;
			}
			// no specific details on this one, but could still point to network issues
			if (exception instanceof SocketException) {
				status = createConnectionProblemStatus(exception);
				break;
			}
			if (exception instanceof SocketTimeoutException) {
				status = createConnectionProblemStatus(exception);
				break;
			}
			if (exception instanceof NoHttpResponseException) {
				status = createConnectionProblemStatus(exception);
				break;
			}
			if (exception instanceof ConnectionClosedException) {
				status = createConnectionProblemStatus(exception);
				break;
			}
			if (exception instanceof CoreException) {
				IStatus exceptionStatus = ((CoreException) exception).getStatus();
				if (MarketplaceClientCore.BUNDLE_ID.equals(exceptionStatus.getPlugin())
						&& exceptionStatus.getCode() == 503) {
					//received service unavailable error from P2 transport
					status = new Status(IStatus.ERROR, BUNDLE_ID, exceptionStatus.getMessage(), exception);
					break;
				}
			}
			Throwable cause = exception.getCause();
			if (cause != exception) {
				exception = cause;
			} else {
				break;
			}
		}
		return status;
	}

	public static IStatus createConnectionProblemStatus(Throwable exception) {
		IStatus status = new Status(IStatus.ERROR, BUNDLE_ID,
				NLS.bind(Messages.MarketplaceClientCore_connectionProblem, exception.getMessage()), exception);
		return status;
	}

	public static boolean isStreamClosedException(Throwable exception) {
		return isIOExceptionWithMessage(exception, STREAM_CLOSED_MESSAGE);
	}

	public static boolean isPipeClosedException(Throwable exception) {
		return isIOExceptionWithMessage(exception, PIPE_CLOSED_MESSAGE);
	}

	public static boolean isPipeBrokenException(Throwable exception) {
		return isIOExceptionWithMessage(exception, PIPE_BROKEN_MESSAGE);
	}

	public static boolean isFailedDownloadException(Throwable exception) {
		return isStreamClosedException(exception) || isPipeClosedException(exception)
				|| isPipeBrokenException(exception);
	}

	private static boolean isIOExceptionWithMessage(Throwable exception, String message) {
		while (exception != null) {
			if (exception instanceof IOException) {
				IOException ioException = (IOException) exception;
				return message.equals(ioException.getMessage());
			}
			Throwable cause = exception.getCause();
			if (cause != exception) {
				exception = cause;
			} else {
				break;
			}
		}
		return false;
	}
}
