/*
 * Copyright (C) 2010 Stanford University
 *
 * 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 edu.stanford.junction.addon;

import java.lang.reflect.Method;
import java.net.URI;
import java.net.URL;
import java.util.Map;

import org.json.JSONObject;

import edu.stanford.junction.JunctionMaker;
import edu.stanford.junction.api.activity.JunctionService;
import edu.stanford.junction.api.messaging.MessageHandler;
import edu.stanford.junction.api.messaging.MessageHeader;

/**
 * TODO: This class is temporarily broken. It requires switchboard information,
 * and so is XMPP specific for now.
 * 
 * Line 71 has been commented out, resulting in nothing working here.
 *
 */
public class JunctionServiceFactory extends JunctionService {

	@Override
	public void onMessageReceived(MessageHeader header, JSONObject message) {
			// TODO: verify you got an activity request
			// somehow get the Activity object
			// that means the request needs
			// * a host
			// * an activity descriptor
			
			
			try {
				
				URI activityURI = new URI(message.getString("activity"));
				
				// TODO: support a factory mapping from serviceName => class
				String className = message.getString("serviceName");
				
				Class c = null;
				try {
					c = Class.forName(className);
				} catch (Exception e) {
					System.out.println("Could not find class for service " + className + ".");
				}
				
				JunctionService service = null;
				Method method = null;
				try {
					method = c.getMethod("newInstance");
				} catch (Exception e) {
					System.out.println("No newInstance method found for " + c + ".");
				}
				service = (JunctionService)method.invoke(null);
				
				String queryPart = activityURI.getQuery(); 
				System.out.println("query part is " + queryPart);
				String localRole = "Unknown";
				int i;
				if ((i = queryPart.indexOf("role=")) >= 0) {
					localRole = queryPart.substring(i+14);
					if ((i = localRole.indexOf("&"))>0) {
						localRole = localRole.substring(0,i);
					}
				}
				
				System.out.println("Setting service role to " + localRole);
				service.setRole(localRole);
				
				System.out.println("service actorID is " + service.getActorID());
				//JunctionMaker.getInstance().newJunction(activityURI,service);					
			} catch (Exception e) {
				e.printStackTrace();
			}
	}



	@Override
	public String getServiceName() {
		return "ServiceFactory";
	}

	
	public static void main(String[] argv) {
		String switchboard="prpl.stanford.edu";
		
		
		JunctionService waiter = new JunctionServiceFactory();
		waiter.register(switchboard);
		while(true) {
			try {
				Thread.sleep(500000);
			} catch (Exception e) {}
		}
	}	
}