package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.plugin.gojara.sessions.GojaraAdminManager;
import org.jivesoftware.openfire.plugin.gojara.sessions.TransportSessionManager;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;

public class GojaraAdminProcessor extends AbstractRemoteRosterProcessor {
	private TransportSessionManager transportSessionManager = TransportSessionManager.getInstance();
	private GojaraAdminManager gojaraAdminManager = GojaraAdminManager.getInstance();

	public GojaraAdminProcessor() {
		Log.info("Created GojaraAdminProcessor");
	}

	/**
	 * Here we process the response of the remote command sent to Spectrum. We have to identify what kind of response it
	 * is, as no tag for the command being responded is being sent. Currently these commands are used in Gojara
	 * TransportSessionManager: online_users ( Chatmsg of online users for specific transport), usernames seperated by
	 * newlines
	 */
	@Override
	public void process(Packet packet, String subdomain, String to, String from) throws PacketRejectedException {
		Message message = (Message) packet;

		// handle different commands
		Log.debug("Intercepted spectrum message: " + message.toString());
		String command = packet.getID();
		if (command.equals("online_users")) {
			handleOnlineUsers(message, subdomain);
		} else if (command.equals("unregister")) {
			handleUnregister(message, subdomain);
		} else if (command.equals("config_check")) {
			handleConfigCheck(subdomain);
		} else if (command.equals("uptime")) {
			handleStatistic(message, subdomain, "uptime");
		} else if (command.equals("messages_from_xmpp")) {
			handleStatistic(message, subdomain, "messages_from_xmpp");
		} else if (command.equals("messages_to_xmpp")) {
			handleStatistic(message, subdomain, "messages_to_xmpp");
		} else if (command.equals("used_memory")) {
			handleStatistic(message, subdomain, "used_memory");
		} else if (command.equals("average_memory_per_user")) {
			handleStatistic(message, subdomain, "average_memory_per_user");
		}
	}

	private void handleOnlineUsers(Message message, String subdomain) {
		Log.debug("Found online_users command!");
		String body = message.getBody();
		if (body.equals("0") || body.startsWith("Unknown command."))
			return;
		String[] content = message.getBody().split("\\r?\\n");
		for (String user : content) {
			JID userjid = new JID(user);
			transportSessionManager.connectUserTo(subdomain, userjid.getNode());
		}
	}

	private void handleUnregister(Message message, String subdomain) {
		Log.debug("Found unregister command! ");
		String body = message.getBody();

		Pattern p = Pattern.compile("^User '(.+)' unregistered.");
		Matcher m = p.matcher(body);
		if (m.matches()) {
			String user = m.group(1);
			JID userJid = new JID(user);
			transportSessionManager.removeRegistrationOfUserFromDB(subdomain, userJid.getNode());
			Log.debug("unregister command was successfull for user: " + userJid.getNode());
		}
	}

	private void handleConfigCheck(String subdomain) {
		gojaraAdminManager.confirmGatewayConfig(subdomain);
		Log.info("Confirm config_check for " + subdomain);
	}

	private void handleStatistic(Message message, String subdomain, String statistic) {
		String body = message.getBody();
		// we dont catch this with exception so we can see what might go wrong. Sometimes S2 responded not knowing the
		// command but i dont really know why
		if (body.startsWith("Unknown command."))
			return;

		int value;
		try {
			value = Integer.parseInt(body);
			gojaraAdminManager.putStatisticValue(subdomain, statistic, value);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}