/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed 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 sample.eventing;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.savan.eventing.client.EventingClient;
import org.apache.savan.eventing.client.EventingClientBean;
import org.apache.savan.eventing.client.SubscriptionStatus;

public class Client {

    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
    private final int MIN_OPTION = 1;
    private final int MAX_OPTION = 9;
    
    private final String SUBSCRIBER_1_ID = "subscriber1";
    private final String SUBSCRIBER_2_ID = "subscriber2";
    
    private ServiceClient serviceClient = null;
    private Options options = null;
    private EventingClient eventingClient = null;
    
    private String toAddressPart = "/axis2/services/PublisherService";
    private String listner1AddressPart = "/axis2/services/ListnerService1";
    private String listner2AddressPart = "/axis2/services/ListnerService2";
    
	private final String applicationNamespaceName = "http://tempuri.org/"; 
	private final String dummyMethod = "dummyMethod";
    
	private static String repo = null;
	private static int port = 8080;
	private static String serverIP = "127.0.0.1";
	
	private static final String portParam = "-p";
	private static final String repoParam = "-r";
	private static final String helpParam = "-h";
	
	public static void main (String[] args) throws Exception {
		
		for (int i=0;i<args.length;i++) {
			if (helpParam.equalsIgnoreCase(args[i])) {
				displayHelp ();
				System.exit(0);
			}
		}
		
		String portStr = getParam(portParam,args);
		if (portStr!=null) {
			port = Integer.parseInt(portStr);
			System.out.println("Server Port was set to:" + port);
		}
		
		String repoStr = getParam(repoParam,args);
		if (repoStr!=null) {
			repo = repoStr;
			System.out.println("Client Repository was set to:" + repo);
		}
		
		Client c = new Client ();
		c.run ();
	}
	
	private static void displayHelp () {
		System.out.println("Help page for the Eventing Client");
		System.out.println("---------------------------------");
		System.out.println("Set the client reposiory using the parameter -r");
		System.out.println("Set the server port using the parameter -p");
	}
	
    /**
     * This will check the given parameter in the array and will return, if available
     *
     * @param param
     * @param args
     * @return
     */
    private static String getParam(String param, String[] args) {
        if (param == null || "".equals(param)) {
            return null;
        }

        for (int i = 0; i < args.length; i = i + 2) {
            String arg = args[i];
            if (param.equalsIgnoreCase(arg) && (args.length >= (i + 1))) {
                return args[i + 1];
            }
        }
        return null;
    }
	
	public void run () throws Exception {
		
		System.out.println("\n");
		System.out.println("Welcome to Axis2 Eventing Sample");
		System.out.println("================================\n");
		
		boolean validOptionSelected = false;
		int selectedOption = -1;
		while (!validOptionSelected) {
			displayMenu();
			selectedOption = getIntInput();
			if (selectedOption>=MIN_OPTION && selectedOption<=MAX_OPTION)
				validOptionSelected = true;
			else 
				System.out.println("\nInvalid Option \n\n");
		}
			
		initClient ();
		performAction (selectedOption);
		
		//TODO publish
		
		System.out.println("Press enter to initialize the publisher service.");
		reader.readLine();
		
		options.setAction("uuid:DummyMethodAction");
		serviceClient.fireAndForget(getDummyMethodRequestElement ());
		
		while (true) {
			
			validOptionSelected = false;
			selectedOption = -1;
			while (!validOptionSelected) {
				displayMenu();
				selectedOption = getIntInput();
				if (selectedOption>=MIN_OPTION && selectedOption<=MAX_OPTION)
					validOptionSelected = true;
				else 
					System.out.println("\nInvalid Option \n\n");
			}
				
			performAction (selectedOption);
			
		}
	}
	
	private void displayMenu () {
		System.out.println("Press 1 to subscribe Listner Service 1");
		System.out.println("Press 2 to subscribe Listner Service 2");
		System.out.println("Press 3 to subscribe both listner services");
		System.out.println("Press 4 to unsubscribe Listner Service 1");
		System.out.println("Press 5 to unsubscribe Listner Service 2");
		System.out.println("Press 6 to unsubscribe both listner services");
		System.out.println("Press 7 to to get the status of the subscription to Service 1");
		System.out.println("Press 8 to to get the status of the subscription to Service 2");
		System.out.println("Press 9 to Exit");
	}
	
	private int getIntInput () throws IOException {
        String option = reader.readLine();
        try {
            return Integer.parseInt(option);
        } catch (NumberFormatException e) {
        	//invalid option
        	return -1;
        }
	}
	
	private void initClient () throws AxisFault {

		String CLIENT_REPO = null;
		String AXIS2_XML = null;
		
		if (repo!=null) {
			CLIENT_REPO = repo;
			AXIS2_XML = repo + File.separator + "axis2.xml";
		} else {
//			throw new AxisFault ("Please specify the client repository as a program argument.Use '-h' for help.");
		}
		
		ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(CLIENT_REPO,null);
		serviceClient = new ServiceClient (configContext,null); //TODO give a repo
		
		options = new Options ();
		serviceClient.setOptions(options);
		serviceClient.engageModule(new QName ("addressing"));
		
		eventingClient = new EventingClient (serviceClient);
		
		String toAddress = "http://" + serverIP + ":" + port + toAddressPart;
		options.setTo(new EndpointReference (toAddress));
	}
	
	private void performAction (int action) throws Exception {
		
		switch (action) {
		case 1:
			doSubscribe(SUBSCRIBER_1_ID);
			break;
		case 2:
			doSubscribe(SUBSCRIBER_2_ID);
			break;
		case 3:
			doSubscribe(SUBSCRIBER_1_ID);
			doSubscribe(SUBSCRIBER_2_ID);
			break;
		case 4:
			doUnsubscribe(SUBSCRIBER_1_ID);
			break;
		case 5:
			doUnsubscribe(SUBSCRIBER_2_ID);
			break;
		case 6:
			doUnsubscribe(SUBSCRIBER_1_ID);
			doUnsubscribe(SUBSCRIBER_2_ID);
			break;
		case 7:
			doGetStatus(SUBSCRIBER_1_ID);
			break;
		case 8:
			doGetStatus(SUBSCRIBER_2_ID);
			break;
		case 9:
			System.exit(0);
			break;
		default:
			break;
		}
	}
	
	private void doSubscribe (String ID) throws Exception {
		EventingClientBean bean = new EventingClientBean ();
		
		String subscribingAddress = null;
		if (SUBSCRIBER_1_ID.equals(ID)) {
            subscribingAddress = "http://" + serverIP + ":" + port + listner1AddressPart;
		} else if (SUBSCRIBER_2_ID.equals(ID)) {
            subscribingAddress = "http://" + serverIP + ":" + port + listner2AddressPart;
		}
	
		bean.setDeliveryEPR(new EndpointReference (subscribingAddress));
	
		//uncomment following to set an expiration time of 10 minutes.
//		Date date = new Date ();
//		date.setMinutes(date.getMinutes()+10);
//		bean.setExpirationTime(date);
		
		eventingClient.subscribe(bean,ID);
		Thread.sleep(1000);   //TODO remove if not sequired
	}
	
	private void doUnsubscribe (String ID) throws Exception {
		eventingClient.unsubscribe(ID);
		Thread.sleep(1000);   //TODO remove if not sequired
	}
	
	private void doGetStatus (String ID) throws Exception {
		SubscriptionStatus status  = eventingClient.getSubscriptionStatus(ID);
		Thread.sleep(1000);   //TODO remove if not sequired
		
		String statusValue = status.getExpirationValue();
		System.out.println("Status of the subscriber '" + ID +"' is" + statusValue);
	}
	
	private OMElement getDummyMethodRequestElement() {
		OMFactory fac = OMAbstractFactory.getOMFactory();
		OMNamespace namespace = fac.createOMNamespace(applicationNamespaceName,"ns1");
		return fac.createOMElement(dummyMethod, namespace);
	}
	
}
