// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.bridge.service.exception;

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;

public class EC2ServiceException extends RuntimeException {
	private static final long serialVersionUID = 8857313467757867680L;
	
	// ServerError & ClientError are correct as of schema version 2010-08-31
	
	public static enum ServerError {
		InsufficientAddressCapacity("Server.InsufficientAddressCapacity", 500),
		InsufficientInstanceCapacity("Server.InsufficientInstanceCapacity", 500),
		InsufficientReservedInstanceCapacity("Server.InsufficientReservedInstanceCapacity", 500),
		InternalError("Server.InternalError", 500),
		Unavailable("Server.Unavailable", 501);
		
		private String errorString;
		private int httpErrorCode;
		
		private ServerError(String errorString, int errorCode) { 
			this.errorString = errorString;
			this.httpErrorCode = errorCode;
		}
		
		public String getErrorString() { return errorString; }
		public int getHttpErrorCode() {return httpErrorCode; }
	}
	
	public static enum ClientError {
		AddressLimitExceeded("Client.AddressLimitExceeded", 400),
		AttachmentLimitExceeded("Client.AttachmentLimitExceeded", 400),
		AuthFailure("Client.AuthFailure", 400),
		Blocked("Client.Blocked", 400),
		FilterLimitExceeded("Client.FilterLimitExceeded", 400),
		IdempotentParameterMismatch("Client.IdempotentParameterMismatch", 400),
		IncorrectState("Client.IncorrectState", 400),
		InstanceLimitExceeded("Client.InstanceLimitExceeded", 400),
		InsufficientInstanceCapacity("Client.InsufficientInstanceCapacity", 400),
		InsufficientReservedInstancesCapacity("Client.InsufficientReservedInstancesCapacity", 400),
		InvalidAMIAttributeItemValue("Client.InvalidAMIAttributeItemValue", 400),
		InvalidAMIID_Malformed("Client.InvalidAMIID.Malformed", 400),
		InvalidAMIID_NotFound("Client.InvalidAMIID.NotFound", 400),
		InvalidAMIID_Unavailable("Client.InvalidAMIID.Unavailable", 400),
		InvalidAttachment_NotFound("Client.InvalidAttachment.NotFound", 400),
		InvalidDevice_InUse("Client.InvalidDevice.InUse", 400),
		InvalidGroup_Duplicate("Client.InvalidGroup.Duplicate", 400),
		InvalidGroup_InUse("Client.InvalidGroup.InUse", 400),
		InvalidGroup_NotFound("Client.InvalidGroup.NotFound", 400),
		InvalidGroup_Reserved("Client.InvalidGroup.Reserved", 400),
		InvalidInstanceID_Malformed("Client.InvalidInstanceID.Malformed", 400),
		InvalidInstanceID_NotFound("Client.InvalidInstanceID.NotFound", 400),
		InvalidIPAddress_InUse("Client.InvalidIPAddress.InUse", 400),
		InvalidKeyPair_Duplicate("Client.InvalidKeyPair.Duplicate", 400),
		InvalidKeyPair_Format("Client.InvalidKeyPair.Format", 400),
		InvalidKeyPair_NotFound("Client.InvalidKeyPair.NotFound", 400),
		InvalidManifest("Client.InvalidManifest", 400),
		InvalidParameterCombination("Client.InvalidParameterCombination", 400),
		InvalidParameterValue("Client.InvalidParameterValue", 400),
		InvalidPermission_Duplicate("Client.InvalidPermission.Duplicate", 400),
		InvalidPermission_Malformed("Client.InvalidPermission.Malformed", 400),
		InvalidReservationID_Malformed("Client.InvalidReservationID.Malformed", 400),
		InvalidReservationID_NotFound("Client.InvalidReservationID.NotFound", 400),
		InvalidResourceId_Format("Client.InvalidResourceId.Format", 400),
		InvalidSnapshotID_Malformed("Client.InvalidSnapshotID.Malformed", 400),
		InvalidSnapshot_NotFound("Client.InvalidSnapshot.NotFound", 400),
		InvalidUserID_Malformed("Client.InvalidUserID.Malformed", 400),
		InvalidReservedInstancesId("Client.InvalidReservedInstancesId", 400),
		InvalidReservedInstancesOfferingId("Client.InvalidReservedInstancesOfferingId", 400),
		InvalidVolumeID_Duplicate("Client.InvalidVolumeID.Duplicate", 400),
		InvalidVolumeID_Malformed("Client.InvalidVolumeID.Malformed", 400),
		InvalidVolume_NotFound("Client.InvalidVolume.NotFound", 400),
		InvalidVolumeID_ZoneMismatch("Client.InvalidVolumeID.ZoneMismatch", 400),
		InvalidZone_NotFound("Client.InvalidZone.NotFound", 400),
		NonEBSInstance("Client.NonEBSInstance", 400),
		PendingVerification("Client.PendingVerification", 400),
		PendingSnapshotLimitExceeded("Client.PendingSnapshotLimitExceeded", 400),
		ReservedInstancesLimitExceeded("Client.ReservedInstancesLimitExceeded", 400),
		SnapshotLimitExceeded("Client.SnapshotLimitExceeded", 400),
		UnknownParameter("Client.UnknownParameter", 400),
		Unsupported("Client.Unsupported", 400),
		VolumeLimitExceeded("Client.VolumeLimitExceeded", 400);

		private String errorString;
		private int httpErrorCode;
		
		private ClientError(String errorString, int errorCode) { 
			this.errorString = errorString;
			this.httpErrorCode = errorCode;
		}
		
		public String getErrorString() { return errorString; }
		public int getHttpErrorCode() {return httpErrorCode; }
	}

	private int httpErrorCode = 0;
	
	public EC2ServiceException() {
	}
	
	public EC2ServiceException(String message) {
		super(message);
	}
	
	public EC2ServiceException(Throwable e) {
		super(e);
	}

	public EC2ServiceException(String message, Throwable e) {
		super(message, e);
	}

	public EC2ServiceException(String message, int errorCode) {
		super(message, new AxisFault(message, new QName("Error")));
		this.httpErrorCode = errorCode;
	}
	
	public EC2ServiceException(String message, Throwable e, int errorCode) {
		super(message, e);
		this.httpErrorCode = errorCode;
	}
	
	public EC2ServiceException(ServerError errorCode, String message) {
		super(message, new AxisFault(message, new QName(errorCode.getErrorString())));
		this.httpErrorCode = errorCode.getHttpErrorCode(); 
	}
	
	public EC2ServiceException(ClientError errorCode, String message) {
		super(message, new AxisFault(message, new QName(errorCode.getErrorString())));
		this.httpErrorCode = errorCode.getHttpErrorCode(); 
	}
	
	public int getErrorCode() {
		return this.httpErrorCode;
	}
}
