/****************************************************************************
 * Copyright (c) 2010 Composent, Inc. and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Composent, Inc. - initial API and implementation
 *
 * SPDX-License-Identifier: EPL-2.0
 *****************************************************************************/
package org.eclipse.ecf.example.clients.applications;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.example.clients.IMessageReceiver;
import org.eclipse.ecf.example.clients.XMPPChatClient;
import org.eclipse.ecf.presence.IPresence;
import org.eclipse.ecf.presence.IPresenceListener;
import org.eclipse.ecf.presence.im.IChatID;
import org.eclipse.ecf.presence.im.IChatMessage;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;

public class ChatRobotApplication implements IApplication, IMessageReceiver, IPresenceListener {

	// this map contains the account -> XMPPID.  Items are added to it via the IPresenceListener.handlePresence method
	private Map rosterUsers = Collections.synchronizedMap(new HashMap());
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.
	 * IApplicationContext)
	 */
	public Object start(IApplicationContext context) throws Exception {
		// process program arguments
		String[] originalArgs = (String[]) context.getArguments().get(
				"application.args");
		if (originalArgs.length < 3) {
			System.out
					.println("Parameters:  <senderAccount> <senderPassword> <targetAccount> [<message>].  e.g. sender@gmail.com senderpassword receiver@gmail.com \"Hello there\"");
			return Integer.valueOf(-1);
		}
		String message = null;
		if (originalArgs.length > 3) message = originalArgs[3];
		
		// Create client
		XMPPChatClient client = new XMPPChatClient(this,this);
		// connect
		client.connect(originalArgs[0], originalArgs[1]);
		
		// Wait for 5s for the roster/presence information to be received
		final Object lock = new Object();
		synchronized (lock) {
			lock.wait(5000);
		}
		
		// Get desired user ID from rosterUsers map.  This is just looking for a user that's active and on our contacts list
		ID targetID = (ID) rosterUsers.get(originalArgs[2]);
		if (targetID == null) {
			System.out.println("target user="+originalArgs[2]+" is not on active on your contacts list.  Cannot send message to this user");
			return Integer.valueOf(0);
		}
		// Construct message
		String msgToSend = (message==null)?"Hi, I'm an ECF chat robot.":message;
		System.out.println("ECF chat robot example sending to targetAccount=" + originalArgs[2] + " message="+msgToSend);
		
		// Send message to targetID
		client.sendChat(targetID, msgToSend);

		// Close up nicely and return
		client.close();
		return IApplication.EXIT_OK;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.equinox.app.IApplication#stop()
	 */
	public void stop() {
	}

	public void handleMessage(IChatMessage chatMessage) {
		System.out.println("handleMessage(" + chatMessage + ")");
	}

	/**
	 * @since 2.0
	 */
	public void handlePresence(ID fromID, IPresence presence) {
		System.out.println("handlePresence fromID="+fromID+" presence="+presence);
		IChatID fromChatID = (IChatID) fromID.getAdapter(IChatID.class);
		if (fromChatID != null) {
			rosterUsers.put(fromChatID.getUsername() + "@" + fromChatID.getHostname(), fromID);
		}
	}

}
