package com.skatestown.services;
import java.util.Vector;
import org.apache.axis.*;
import org.apache.axis.message.*;
import org.apache.axis.handlers.BasicHandler;
import org.apache.axis.encoding.SOAPTypeMappingRegistry;
import bws.BookUtil;
import com.skatestown.backend.EmailConfirmation;

/**
 * Modu obsugi nagwka Email
 */
public class EMailHandler extends BasicHandler
{
	/**
	 * Pomocnicza metoda do odczytywania parametrw zdalnego wywoania procedury z komunikatu SOAP.
	 */
	private Object getParam(Vector params, int index)
	{
		return ((RPCParam)params.get(index)).getValue();
	}

	/**
	 * Metoda odszukuje nagwek Email i wysya poczt elektroniczn potwierdzenie wykonania operacji na podstawie parametrw dania i wyniku sprawdzenia stanu magazynu.
	 */
public void invoke(MessageContext msgContext) throws AxisFault
	{
		try {
			// Prba odczytania nagwka Email	
			Message 	reqMsg = msgContext.getRequestMessage();
			SOAPEnvelope	reqEnv = reqMsg.getAsSOAPEnvelope();
			SOAPHeader	header = reqEnv.getHeaderByName(
				"http://www.skatestown.com/",
				"Email");

			if (header != null)
			{
				// Zaznaczamy, e nagwek zosta przetworzony
				header.setProcessed(true);

				// Odczytujemy adres poczty elektronicznej z nagwka
				String email = (String)header.getValueAsType(SOAPTypeMappingRegistry.XSD_STRING);

				// Odczytanie parametrw dania - numeru magazynowego i liczby egzemplarzy
				RPCElement reqRPC = (RPCElement)reqEnv.getFirstBody();
				Vector params = reqRPC.getParams();
				String sku = (String)getParam(params, 0);
				Integer quantity = (Integer)getParam(params, 0);

				// Odebranie wyniku sprawdzenia 
				Message respMsg = msgContext.getResponseMessage();
				SOAPEnvelope respEnv = respMsg.getAsSOAPEnvelope();
				RPCElement respRPC = (RPCElement)respEvn.getFirstBody();
				Boolean result = (Boolean)getParam(respRPC.getParams(), 0);

				// Wysanie potwierdzenia
				EmailConfirmation ec = new EmailConfirmation(BookUtil.getResourcePath(msgContext, "/resources/email.log"));
				ec.send(email, sku, quantity.intValue(), result.booleanValue());		
			}
		}
		catch (Exception e)
		{
			throw new AxisFault(e);
		}
	}
	
	/**
	 * Metoda wymagana w moduach obsugi. W tym przypadku o pustej treci
	 */
	public void undo(MessageContext msgContext)
	{
	}
}
