package com.ejie.ab79.webservice;

import java.net.URL;
import java.util.Locale;
import java.util.Map;

import javax.annotation.Resource;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;

import com.ejie.ab79.clientesWS.ab59WebService.Ab59Exception;
import com.ejie.ab79.clientesWS.ab59WebService.Ab59ExceptionGeneral;
import com.ejie.ab79.clientesWS.ab59WebService.Ab59WebService;
import com.ejie.ab79.clientesWS.ab59WebService.PropuestaSancionIdentificadoresWS;
import com.ejie.ab79.clientesWS.ab59WebService.PropuestaSancionWS;
import com.ejie.ab79.clientesWS.ab59WebService.WebServiceImpl;
import com.ejie.ab79.comun.UtilsConfig;

/**
 * 
 *  
 *
 */

@Service(value = "ab59WebServiceServiceImpl")
public class ab59WebServiceServiceImpl implements ab59WebServiceService {

	@Resource
	ReloadableResourceBundleMessageSource appMessageSource;

	public static final Logger logger = LoggerFactory.getLogger(ab59WebServiceServiceImpl.class);

	private Ab59WebService service;

	private WebServiceImpl getab59WebServiceServiceImplServicePort() {
		return this.getab59WebServiceServiceImplServicePort(true);
	}

	/**
	 * 
	 * @param getPort
	 *            boolean
	 * 
	 * @return proxy WebServiceImpl
	 */
	private WebServiceImpl getab59WebServiceServiceImplServicePort(boolean getPort) {
		try {

			if (this.service == null) {

				// Creamos el servicio
				logger.info("getab59WebServiceServiceImplServicePort - Crear llamada al Servicio Web:");
				logger.info("Ab59WebService_URL:" + UtilsConfig.getAppProperties().getProperty("Ab59WebService_URL"));
				logger.info("Ab59WebService_QNAME:" + UtilsConfig.getAppProperties().getProperty("Ab59WebService_QNAME"));
				logger.info("Ab59WebService_WS:" + UtilsConfig.getAppProperties().getProperty("Ab59WebService_WS"));

				service = new Ab59WebService(new URL(UtilsConfig.getAppProperties().getProperty("Ab59WebService_URL")),
						new QName(UtilsConfig.getAppProperties().getProperty("Ab59WebService_QNAME"),
								UtilsConfig.getAppProperties().getProperty("Ab59WebService_WS")));

				logger.info(
						"getab59WebServiceServiceImplServicePort - Creación de la llamada al Servicio Web finalizada");

			}
			if (getPort) {

				logger.info("getab59WebServiceServiceImplServicePort - Antes de obtener el proxy");

				WebServiceImpl proxy = this.service.getAb59WebServicePort();

				logger.info("getab59WebServiceServiceImplServicePort - Proxy obtenido");

				Map<String, Object> ctxt = ((BindingProvider) proxy).getRequestContext();

				logger.info("getab59WebServiceServiceImplServicePort - Contexto obtenido");

				ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, UtilsConfig.getAppProperties().getProperty("Ab59WebService_URL"));

				logger.info("getab59WebServiceServiceImplServicePort - Contexto cargado");

				return proxy;
			}
		} catch (Exception e) {

			logger.error("getab59WebServiceServiceImplServicePort. Excepcion:" + e.getMessage());

			this.service = null;
		}
		return null;
	}

	@Override
	public PropuestaSancionIdentificadoresWS crearPropuestaSancion(PropuestaSancionWS objetoPropuestaSancion,
			String usuario, Integer idOrigenPropuestaSancion, Integer idTercero, Integer idDireccion)
			throws Ab59Exception {

		try {
			return getab59WebServiceServiceImplServicePort().crearPropuestaSancion(objetoPropuestaSancion, usuario,
					idOrigenPropuestaSancion, idTercero, idDireccion);
		} catch (Exception exception) {

			logger.error("getab59WebServiceServiceImplServicePort.crearPropuestaSancion", exception);

			String sCodigoError = "error.conectarAB79";

			Ab59ExceptionGeneral ab59ExceptionGeneral = new Ab59ExceptionGeneral();
			ab59ExceptionGeneral.setCodigo(sCodigoError);
			ab59ExceptionGeneral
					.setMensajeCastellano(appMessageSource.getMessage(sCodigoError, null, new Locale("es")));
			ab59ExceptionGeneral.setMensajeEuskera(appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			throw new Ab59Exception(exception.getMessage(), ab59ExceptionGeneral);

		} finally {
			logger.info("getab59WebServiceServiceImplServicePort.crearPropuestaSancion - Final");
		}
	}

	@Override
	public String modificarPropuestaSancion(PropuestaSancionWS objetoPropuestaSancion, String usuario,
			Integer idTercero, Integer idDireccion) throws Ab59Exception {
		try {
			return getab59WebServiceServiceImplServicePort().modificarPropuestaSancion(objetoPropuestaSancion, usuario,
					idTercero, idDireccion);
		} catch (Exception exception) {

			logger.error("getab59WebServiceServiceImplServicePort.modificarPropuestaSancion", exception);

			String sCodigoError = "error.conectarAB79";

			Ab59ExceptionGeneral ab59ExceptionGeneral = new Ab59ExceptionGeneral();
			ab59ExceptionGeneral.setCodigo(sCodigoError);
			ab59ExceptionGeneral
					.setMensajeCastellano(appMessageSource.getMessage(sCodigoError, null, new Locale("es")));
			ab59ExceptionGeneral.setMensajeEuskera(appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			throw new Ab59Exception(exception.getMessage(), ab59ExceptionGeneral);

		} finally {
			logger.info("getab59WebServiceServiceImplServicePort.modificarPropuestaSancion - Final");
		}
	}

	@Override
	public String eliminarPropuestaSancion(Integer idPropuestaSancion, String usuario) throws Ab59Exception {
		try {
			return getab59WebServiceServiceImplServicePort().eliminarPropuestaSancion(idPropuestaSancion, usuario);
		} catch (Exception exception) {

			logger.error("getab59WebServiceServiceImplServicePort.eliminarPropuestaSancion", exception);

			String sCodigoError = "error.conectarAB79";

			Ab59ExceptionGeneral ab59ExceptionGeneral = new Ab59ExceptionGeneral();
			ab59ExceptionGeneral.setCodigo(sCodigoError);
			ab59ExceptionGeneral
					.setMensajeCastellano(appMessageSource.getMessage(sCodigoError, null, new Locale("es")));
			ab59ExceptionGeneral.setMensajeEuskera(appMessageSource.getMessage(sCodigoError, null, new Locale("eu")));

			throw new Ab59Exception(exception.getMessage(), ab59ExceptionGeneral);

		} finally {
			logger.info("getab59WebServiceServiceImplServicePort.eliminarPropuestaSancion - Final");
		}
	}
}
