package com.ejie.ad74a.jms.util;

import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.ws.client.platea.model.notification.NotificationBody;
import com.ejie.ad74a.ws.client.platea.model.notification.NotificationBody.Property;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TKeyValue;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TNotificationBody;

public class JMSHelper {

	private static final Logger logger = LoggerFactory.getLogger(JMSHelper.class);

	private JMSHelper() {
		super();
	}

	/**
	 * Parsea un xml y retorna un Map donde el key es el property del xml y el value
	 * es el value
	 * 
	 * @param strPfMensaje String
	 * @return mapa Map
	 */
	public static Map<String, Object> parsearMensajeJms(String strPfMensaje) {
		final StringReader readerMensaje = new StringReader(strPfMensaje);
		List<Property> arrProperties = null;
		final HashMap<String, Object> mapaMensaje = new HashMap<String, Object>();
		try {
			MessageParser<NotificationBody> parserTarea = new MessageParser<NotificationBody>(
					NotificationBody.class.getPackage().getName());
			NotificationBody notificationBody = parserTarea.parse(strPfMensaje);

			arrProperties = notificationBody.getProperty();

			Pattern p = Pattern.compile(Constantes.REG_EXP_CDATA);

			for (int i = 0; i < arrProperties.size(); i++) {
				String valor = "";
				if (arrProperties.get(i).getValue() != null && !arrProperties.get(i).getValue().get(0).equals("")) {
					valor = arrProperties.get(i).getValue().get(0).toString();

					final Matcher m = p.matcher(valor);
					if (m.matches()) {
						valor = m.group(2);
					}
				}
				mapaMensaje.put(arrProperties.get(i).getName(), valor);
			}
			JMSHelper.logger.debug("Mensaje parseado: " + mapaMensaje.toString());
			mapaMensaje.put("xmlValue", notificationBody.getXmlValue().get(0));

		} catch (Exception e1) {
			JMSHelper.logger.error("PlateaXmlParser.parsearMensajeJms()", e1);
			JMSHelper.logger.error("PlateaXmlParser.parsearMensajeJms() -Error parseando mensaje JMS.", e1);
		}

		return mapaMensaje;
	}

	/**
	 * Parsea un xml y retorna un Map donde el key es el property del xml y el value
	 * es el value
	 * 
	 * @param notificationBody NotificationBody
	 * @return mapa Map
	 */
	public static Map<String, Object> parsearMensajeJms(TNotificationBody notificationBody) {
		List<TKeyValue> arrProperties = null;
		final HashMap<String, Object> mapaMensaje = new HashMap<String, Object>();
		try {
			arrProperties = notificationBody.getParameter();

			Pattern p = Pattern.compile(Constantes.REG_EXP_CDATA);

			for (int i = 0; i < arrProperties.size(); i++) {
				String valor = "";
				if (arrProperties.get(i).getValue() != null && !arrProperties.get(i).getValue().equals("")) {
					valor = arrProperties.get(i).getValue();

					final Matcher m = p.matcher(valor);
					if (m.matches()) {
						valor = m.group(2);
					}
				}
				mapaMensaje.put(arrProperties.get(i).getKey(), valor);
			}
			JMSHelper.logger.debug("Mensaje parseado: " + mapaMensaje.toString());

		} catch (Exception e1) {
			JMSHelper.logger.error("PlateaXmlParser.parsearMensajeJms()", e1);
			JMSHelper.logger.error("PlateaXmlParser.parsearMensajeJms() -Error parseando TNotificationBody.", e1);
		}

		return mapaMensaje;
	}

}
