package com.ejie.ad74a.mdb;

import java.math.BigDecimal;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.interceptor.Interceptors;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor;

import com.ejie.ad74a.constantes.Constantes;
import com.ejie.ad74a.model.PeticionesPs;
import com.ejie.ad74a.service.PeticionesPsService;
import com.ejie.ad74a.util.comun.UtilidadesXML;
import com.ejie.ad74a.ws.client.prestadorWS.MiddlewareWebService;
import com.ejie.ad74a.ws.client.prestadorWS.data.RecepcionPeticionAd74A;
import com.ejie.ad74a.ws.client.prestadorWS.data.RecepcionServicioAd74AType;
import com.ejie.ad74a.ws.server.televida.model.Respuesta;


@Interceptors(value = SpringBeanAutowiringInterceptor.class)
@MessageDriven(name = "Ad74aRespuestaPrestadorJMS", activationConfig = {
		@ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "ad74a.ad74aJMSFactory"),
		@ActivationConfigProperty(propertyName = "destinationJndiName", propertyValue = "ad74a.ad74aRespuestaPrestadorJMS"),
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
@TransactionManagement(TransactionManagementType.BEAN)

public class Ad74aRespuestaPrestadorJMS implements MessageListener {

	private static final Logger logger = LoggerFactory.getLogger(Ad74aRespuestaPrestadorJMS.class);
	
	@Autowired
	private PeticionesPsService peticionesPsService;
	
	@Autowired
	private MiddlewareWebService middlewareWebService;
	
	@Value("${" + Constantes.PRINCIPAL_INTER_X87B + "}")
	private String x87bPrincipal;
	@Value("${" + Constantes.CREDENCIAL_INTER_X87B + "}")
	private String x87bCredencial;

	@Override
	public void onMessage(Message message) {
		Ad74aRespuestaPrestadorJMS.logger.info("Recibimos mensaje ad74aRespuestaPrestadorJMS");
		Ad74aRespuestaPrestadorJMS.logger.info("Mensaje:" + message.toString());
		
		// TODO:
		try {
			// 1.- Obtener los datos del mensaje
			ObjectMessage msg = null;
			String idMensaje = "";
			if (message instanceof ObjectMessage) {
				msg = (ObjectMessage) message;
				Ad74aRespuestaPrestadorJMS.logger.debug("Ad74aRespuestaPrestadorJMS - onMessage msg: " + msg);
				
				// 2.- Obtener los datos de la bbdd a partir del id del mensaje (tabla AD74A99T00)
				PeticionesPs respuestaPs = new PeticionesPs();
				respuestaPs.setIdPeticion99((Long) msg.getObject());
				respuestaPs = this.peticionesPsService.find(respuestaPs);

				// String xml = UtilSQL.clobToString(peticionPs.getMensaje99());
				String xml = respuestaPs.getMensaje99Str();
				Respuesta respuesta = (Respuesta) UtilidadesXML.unmarshallerObject(xml, Respuesta.class);
								
				// 3.- Enviar la respuesta via SOAP
				// TODO: no se está enviando ni la fecha ni el mensaje
				// El WSDL del PS no lo tiene
				RecepcionPeticionAd74A resp = new RecepcionPeticionAd74A();
				RecepcionServicioAd74AType respType = new RecepcionServicioAd74AType();
				respType.setCodEstado(new BigDecimal(respuesta.getCodRespuesta()));
				respType.setIdPeticion(new BigDecimal(respuestaPs.getIdPeticionOriginal99()));
				resp.setRecepcionServicioAd74AType(respType);
				middlewareWebService.recepcionPeticionAd74A(resp, x87bPrincipal, x87bCredencial);
				
				// 4.- Marcar la petición como procesada
				this.peticionesPsService.updateProcesado(respuestaPs);				
				
			}

			// 5.- Marcar como procesada en la cola
			message.acknowledge();
		} catch (Throwable e) {
			ExceptionUtils.getStackTrace(e);
			Ad74aRespuestaPrestadorJMS.logger.error("Ad74aRespuestaPrestadorJMS Error al tratar el message: " + ExceptionUtils.getStackTrace(e));
		}
	}

}
