/**
 * 
 */
package com.ejie.ab61.adaptadores.service;

import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.ejie.ab61.clientesWS.X43CuentasInteresados.TInteresado;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TInteresadosSearch;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.TInterestedSearch;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.X43AWsRriPublicService;
import com.ejie.ab61.clientesWS.X43CuentasInteresados.X43AWsRriPublicService_Service;
import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.comun.utilidades.config.Config;
import com.ejie.ab61.exceptions.X43CuentasInteresadosException;

/**
 *  
 * 
 */
@Service(value = "X43CuentasInteresadosServiceImpl")
public class X43CuentasInteresadosServiceImpl implements X43CuentasInteresadosService {

	private static final Logger logger = LoggerFactory.getLogger(X43CuentasInteresadosServiceImpl.class);
	private X43AWsRriPublicService_Service service;

	private static final QName qname = new QName("com/ejie/x43a/rri/ws", "X43aWsRriPublicService");

	/**
	 * 
	 * @return X43PPSPortType
	 */
	private X43AWsRriPublicService getX43CuentasInteresadosServicePort() {
		return this.getX43CuentasInteresadosServicePort(true);
	}

	/**
	 * 
	 * @param getPort
	 *            boolean
	 * 
	 * @return X43PPSPortType
	 */
	private X43AWsRriPublicService getX43CuentasInteresadosServicePort(boolean getPort) {
		try {
			Properties prop = Config.loadProperties(Constantes.FICHERO_CONFIGURACION);

			if (this.service == null) {

				X43CuentasInteresadosServiceImpl.logger.info(
						"URL del servicio X43CuentasInteresados = " + prop.getProperty("X43CuentasInteresados_URL"));

				// Creamos el servicio
				this.service = new X43AWsRriPublicService_Service(
						new URL(prop.getProperty("X43CuentasInteresados_URL")), X43CuentasInteresadosServiceImpl.qname);

				// definimos un handler cliente
				this.service.setHandlerResolver(new HandlerResolver() {
					@SuppressWarnings(value = "unchecked")
					public List getHandlerChain(PortInfo portInfo) {
						return Collections.singletonList(new X43CuentasInteresadosServiceHandler());
					}
				});

				X43CuentasInteresadosServiceImpl.logger.info(
						"getX43CuentasInteresadosServicePort. Dentro de creaci�n del servicio - Definido el handler");
			}
			if (getPort) {

				X43CuentasInteresadosServiceImpl.logger
						.info("getX43CuentasInteresadosServicePort. Antes de obtener el proxy");

				X43AWsRriPublicService proxy = this.service.getX43AWsRriPublicServicePort();

				X43CuentasInteresadosServiceImpl.logger
						.info("getX43CuentasInteresadosServicePort. Despues de obtener el proxy");

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

				X43CuentasInteresadosServiceImpl.logger
						.info("getX43CuentasInteresadosServicePort. Despues de obtener el contexto");

				ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
						// prop.getProperty("URL_WS_X43CuentasInteresados"));
						prop.getProperty("X43CuentasInteresados_URL"));

				X43CuentasInteresadosServiceImpl.logger
						.info("getX43CuentasInteresadosServicePort. Cargado el contexto");

				return proxy;
			}

		} catch (Exception e) {

			X43CuentasInteresadosServiceImpl.logger
					.info("getX43CuentasInteresadosServicePort. Excepcionnnn:" + e.getMessage());

			this.service = null;
		}
		return null;
	}

	/**
	 * Metodo que devuelve la información de los interesados por los que se
	 * pregunta
	 * 
	 * @param tInteresadosSearch
	 *            TInteresadosSearch
	 * 
	 * @return List<TInteresado>
	 * 
	 * @throws X43CuentasInteresadosException
	 *             X43CuentasInteresadosException
	 */
	public List<TInteresado> getPersonsConsent(TInterestedSearch tInterestedSearch)
			throws X43CuentasInteresadosException, Exception {

		return this.getX43CuentasInteresadosServicePort().getPersonsConsent(tInterestedSearch);

	}

}
