/**
 * 
 */
package org.jivesoftware.wildfire.plugin.handler;

import java.util.Date;
import java.io.*;

import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.QName;
import org.jivesoftware.util.Log;
import org.jivesoftware.wildfire.ClientSession;
import org.jivesoftware.wildfire.SessionManager;
import org.jivesoftware.wildfire.IQHandlerInfo;
import org.jivesoftware.wildfire.PacketException;
import org.jivesoftware.wildfire.auth.UnauthorizedException;
import org.jivesoftware.wildfire.handler.IQHandler;
import org.jivesoftware.wildfire.user.User;
import org.jivesoftware.wildfire.user.UserNotFoundException;
import org.jivesoftware.wildfire.vcard.VCardManager;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.PacketError;


/**
 * @author allenj
 * 
 */

public class GEOIQHandler extends IQHandler {

	private IQHandlerInfo info;

	private Element responseElement;

	private SessionManager sessionManager = SessionManager.getInstance();

	public GEOIQHandler() {

		super("XMPP Server GEO Information Handler");
		info = new IQHandlerInfo("query", "jabber:iq:geo");
		responseElement = DocumentHelper.createElement(QName.get("query",
				"jabber:iq:geo"));
		responseElement.addElement("jid");
		responseElement.addElement("ip");
		responseElement.addElement("latitude");
		responseElement.addElement("longitude");
		responseElement.addElement("city");
		responseElement.addElement("region");
		responseElement.addElement("country");
		responseElement.addElement("postalcode");
		responseElement.addElement("areacode");
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.jivesoftware.wildfire.handler.IQHandler#handleIQ(org.xmpp.packet.IQ)
	 */
	public IQ handleIQ(IQ packet) {
		IQ response = null;
		response = IQ.createResultIQ(packet);
		response.setChildElement(buildResponse(packet));
		return response;
	}

	/**
	 * Build the responseElement packet
	 */
	private Element buildResponse(IQ packet) {
		Element response = responseElement.createCopy();
		Element iq = packet.getElement();
		Element query = iq.element("query");

		if (IQ.Type.get == packet.getType()) {
			String jid = query.elementTextTrim("jid");
			String ipaddr = null;

			if (jid != null) {
				JID jid_o = new JID(jid);
				ClientSession session = sessionManager.getSession(jid_o);

				// If no session was found then answer an error (if possible)
				if (session == null)
					return handleNoSession(jid, packet);

				response.element("jid").setText(jid);
				// retrieve the IP address from the client session
				ipaddr = (String) session.getSessionData(jid);

				if (ipaddr != null) {
					response.element("ip").setText(ipaddr.trim());
				}
            else
            {   
               response.element("ip").setText(session.getConnection.getInetAddress());
            }

			}

		} else if (IQ.Type.set == packet.getType()) {
			String jid = query.elementTextTrim("jid");
			String ipaddr = query.elementTextTrim("ip");

			if (jid != null) {
				// System.out.println("JID is not null, it's " + jid);
				JID jid_o = new JID(jid);

				ClientSession session = sessionManager.getSession(jid_o);
				// If no session was found then answer an error (if possible)
				if (session == null)
					return handleNoSession(jid, packet);

				// set the IP address of the client in the session
				session.setSessionData(jid, ipaddr);
				// fill in the following based on the JID
				response.element("setIP").setText("true");
			}
		}

		return response;
	}

	private Element handleNoSession(String jid, IQ packet) {
		Log.error("Error during JID lookup. Session not found in "
				+ sessionManager.getSessions() + " for key " + jid);
		// This error packet probably won't make it through
		IQ reply = IQ.createResultIQ(packet);
		reply.setChildElement(packet.getChildElement().createCopy());
		reply.setError(PacketError.Condition.internal_server_error);
		return reply.getElement();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.jivesoftware.wildfire.handler.IQHandler#getInfo()
	 */
	@Override
	public IQHandlerInfo getInfo() {
		// TODO Auto-generated method stub
		return info;
	}

}
