package com.reucon.openfire.plugin.archive.xep0313;

import org.dom4j.*;
import org.jivesoftware.openfire.handler.IQHandler;
import org.jivesoftware.openfire.session.LocalClientSession;
import org.jivesoftware.openfire.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmpp.packet.IQ;
import org.xmpp.packet.Message;

/**
 * XEP-0313 IQ Query Handler
 */
class IQQueryHandler0 extends IQQueryHandler {

	private static final Logger Log = LoggerFactory.getLogger(IQHandler.class);
	private static final String MODULE_NAME = "Message Archive Management Query Handler v0";

	IQQueryHandler0() {
		super(MODULE_NAME, "urn:xmpp:mam:0");
	}

	@Override
	protected void sendMidQuery(IQ packet, Session session) {
		sendAcknowledgementResult(packet, session);
	}

	@Override
	protected void sendEndQuery(IQ packet, Session session, QueryRequest queryRequest) {
		sendFinalMessage(session, queryRequest);
	}

	/**
	 * Send result packet to client acknowledging query.
	 * @param packet Received query packet
	 * @param session Client session to respond to
	 */
	private void sendAcknowledgementResult(IQ packet, Session session) {
		IQ result = IQ.createResultIQ(packet);
		session.process(result);
	}

	/**
	 * Send final message back to client following query.
	 * @param session Client session to respond to
	 * @param queryRequest Received query request
	 */
	private void sendFinalMessage(Session session,
			final QueryRequest queryRequest) {

		Message finalMessage = new Message();
		finalMessage.setTo(session.getAddress());
		Element fin = finalMessage.addChildElement("fin", NAMESPACE);
		completeFinElement(queryRequest, fin);

		session.process(finalMessage);
	}

}
