package com.ejie.ab61.comun.utilidades;

import java.io.StringWriter;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;

import com.ejie.ab61.comun.CargarPropiedades;
import com.ejie.ab61.comun.Constantes;

import n38a.exe.N38APISesion;

/**
 * 
 *  
 * 
 */
public class XlnetsUtils {
	private static XlnetsUtils INSTANCE = null;

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

	/**
	 * CO
	 */
	// Private constructor suppresses
	private XlnetsUtils() {
	}

	/**
	 * creador sincronizado para protegerse de posibles problemas multi-hilo
	 * otra prueba para evitar instanciación múltiple
	 * 
	 */
	private synchronized static void createInstance() {
		if (XlnetsUtils.INSTANCE == null) {
			XlnetsUtils.INSTANCE = new XlnetsUtils();
		}
	}

	/**
	 * 
	 * @return XlnetsUtils
	 */
	public static XlnetsUtils getInstance() {
		if (XlnetsUtils.INSTANCE == null) {
			XlnetsUtils.createInstance();
		}
		return XlnetsUtils.INSTANCE;
	}

	/**
	 * Metodo que realiza el login de aplicacion en XLNETs
	 * 
	 * @param isSimulated
	 *            String: Parametro que determina si el login de aplicacion se
	 *            realiza o se simula
	 * 
	 * @return String: Token de aplicación de XLNets
	 * @throws Exception
	 */
	public String getTokenAplicacion(boolean isSimulated) throws Exception {
		String strDocumento = "";

		if (isSimulated) {
			XlnetsUtils.logger.debug("Y41bUtils.getTokenAplicacion - LOCAL");
			strDocumento = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><n38><elementos tipo=\"n38APISesionCrearToken\"><elemento subtipo=\"N38Sesion\"><parametro id=\"n38fhum\"><valor>1274172332621</valor></parametro><parametro id=\"cn\"><valor>U94B1266482307127</valor></parametro><parametro id=\"n38uidsesion\"><valor>1266483038919</valor></parametro><parametro id=\"n38login\"><valor>U94B</valor></parametro><parametro id=\"n38perfiles\"><valor>Publico</valor><valor>R02F-PF-0005</valor><valor>R02F-PF-0015</valor><valor>U94B-PF-0003</valor></parametro><parametro id=\"n38organizacion\"><valor>400</valor></parametro><parametro id=\"iphostnumber\"><valor>10.190.20.40</valor></parametro><parametro id=\"n38reintentossesion\"><valor>1</valor></parametro><parametro id=\"n38sexpiracion\"><valor>988999999999</valor></parametro><parametro id=\"n38tiposesion\"><valor>C/S</valor></parametro><parametro id=\"n38puestouid\"><valor>U94B</valor></parametro><parametro id=\"n38fechacreacion\"><valor>1266482307127</valor></parametro><parametro id=\"n38personauid\"><valor>U94B</valor></parametro><parametro id=\"n38fechalogoff\"><valor/></parametro><parametro id=\"n38valorhash\"><valor>PsVYfgAOyNCqCJDeNgqrNOw4PPQ=</valor></parametro><parametro id=\"n38fechainicio\"><valor>1266482307127</valor></parametro><parametro id=\"n38idioma\"><valor>3</valor></parametro><parametro id=\"dni\"><valor>U94B</valor></parametro><parametro id=\"n38comportamientoip\"><valor>ipv</valor></parametro><parametro id=\"n38idcontexto\"><valor>intranet</valor><valor>internet</valor></parametro><parametro id=\"n38loginasociado\"><valor>https://xlnets.servicios.jakina.ejiedes.net:443/n38a/N38LoginInicioServlet</valor></parametro><parametro id=\"n38listacede\"><valor>x_cddes01:48880:1000</valor><valor>x_cddes02:48880:1000</valor></parametro><parametro id=\"n38comportamientofirma\"><valor>False</valor></parametro><parametro id=\"n38exclusivo\"><valor>False</valor></parametro><parametro id=\"n38dominiouid\"><valor>D0_Servidores11</valor></parametro><parametro id=\"n38urlsredireccion\"><valor>http://xlnets.servicios.jakina.ejiedes.net/n38nWar/N38NodoEstrellaServlet</valor></parametro><parametro id=\"n38listags\"><valor>x_ssdes01:47770:1000</valor><valor>x_ssdes02:47770:1000</valor></parametro><parametro id=\"n38rangoip\"><valor>10.200.56.11</valor><valor>10.170.9.109</valor><valor>10.170.8.4</valor><valor>10.170.8.5</valor><valor>10.170.9.4</valor><valor>10.170.9.5</valor><valor>10.170.9.137</valor><valor>10.170.9.79</valor><valor>10.200.56.57</valor><valor>10.170.17.114</valor><valor>10.200.8.216</valor><valor>10.200.8.217</valor><valor>10.200.8.218</valor><valor>10.190.8.14</valor><valor>10.170.17.105</valor><valor>192.168.56.231</valor><valor>192.168.56.233</valor><valor>192.168.56.242</valor><valor>192.168.56.241</valor><valor>10.190.20.25</valor><valor>10.190.24.15</valor><valor>192.168.56.234</valor><valor>10.190.8.101</valor><valor>10.190.20.20</valor><valor>192.168.56.21</valor><valor>192.168.56.13</valor><valor>192.168.56.17</valor><valor>192.168.56.11</valor><valor>192.168.56.228</valor><valor>10.170.8.216</valor><valor>192.168.56.58</valor><valor>10.190.20.14</valor><valor>10.170.17.201</valor><valor>555.</valor><valor>10.190.20.43</valor><valor>10.190.20.47</valor><valor>10.190.20.32</valor><valor>10.190.20.40</valor><valor>10.190.20.11</valor><valor>10.190.20.56</valor><valor>10.190.20.38</valor><valor>10.190.8.69</valor><valor>10.190.8.70</valor><valor>10.170.17.200</valor><valor>10.190.20.50</valor><valor>10.190.40.15</valor><valor>10.190.40.16</valor><valor>10.190.40.18</valor><valor>10.190.40.19</valor><valor>10.190.20.69</valor><valor>10.190.20.70</valor><valor>10.170.9.21</valor></parametro><parametro id=\"n38dominioscookies\"><valor>.jakina.ejgvdns</valor></parametro><parametro id=\"n38listamsservidores\"><valor>hola Aitzi</valor></parametro><parametro id=\"n38servidoraudit\"><valor>x_auddes01:4560</valor></parametro><parametro id=\"n38subjectcert\"><valor>NO</valor></parametro><parametro id=\"n38certificadopoliticas\"><valor>NO</valor></parametro><parametro id=\"n38oleserver\"><valor>false</valor></parametro><parametro id=\"n38cadescripciondominio\"><valor>ras internete</valor></parametro><parametro id=\"n38eudescripciondominio\"><valor>rak Interneta</valor></parametro><parametro id=\"n38crearsesionapp\"><valor>true</valor></parametro><parametro id=\"n38urlportal\"><valor>https://xlnets.servicios.jakina.ejiedes.net/n38a/N38servletPortal</valor></parametro><parametro id=\"n38urldispatcher\"><valor>http://xlnets.servicios.jakina.ejiedes.net/n38nWar/N38DispatcherEstrellaServlet</valor></parametro><parametro id=\"n38urlsgsd\"><valor>https://xlnets.servicios.jakina.ejiedes.net/n38nCDominioWar/N38GestorCDominioServlet</valor></parametro><parametro id=\"n38dominiocomuncookie\"><valor>.jakina.ejgvdns</valor></parametro><parametro id=\"n38sistemaxlnetsuid\"><valor>desarrollo-produccion</valor></parametro><parametro id=\"n38direccionproxy\"><valor>http://www.servicios.comunes.ejiedes.net/proxy</valor></parametro><parametro id=\"n38direcciongrc\"><valor>http://xlnets.servicios.jakina.ejiedes.net/n38rWar/N38rFachadaGRCServlet</valor></parametro><parametro id=\"n38grupoorganicouid\"><valor/></parametro><parametro id=\"n38orgunituid\"><valor/></parametro><parametro id=\"n38urlfinal\"><valor>http://jakina</valor></parametro><parametro id=\"n38uidsesionglobal\"><valor>desarrollo-produccion-1266483038919</valor></parametro><parametro id=\"n38cadenaconfianza\"><valor>desarrollo-produccion</valor></parametro><parametro id=\"n38politicauid\"><valor>P2</valor></parametro></elemento></elementos></n38>";
		}
		try {

			N38APISesion miApiSesion = new N38APISesion();
			Document documento = miApiSesion.n38APISesionCrearApp(Constantes.CODIGO_APLICACION);
			strDocumento = this.fncObtenerStringDoc(documento);
		} catch (TransformerException e_getTokenAplicacion) {
			XlnetsUtils.logger.error("Y41bUtils.getTokenAplicacion", e_getTokenAplicacion);
			throw new Exception("error.xlnets.getTokenAplicacion", e_getTokenAplicacion);
		}

		XlnetsUtils.logger.debug("getTokenAplicacion - Token:" + strDocumento);
		return strDocumento;
	}

	/**
	 * Metodo que realiza el login de aplicacion en XLNETs
	 * 
	 * 
	 * @return String: Token de aplicación de XLNets
	 * @throws Exception
	 */
	public String getTokenAplicacion() throws Exception {
		String strDocumento = "";

		try {
			XlnetsUtils.logger.debug(".getTokenAplicacion - EJIE");
			N38APISesion miApiSesion = new N38APISesion();
			Document documento = miApiSesion
					.n38APISesionCrearApp(CargarPropiedades.getConfigAplicacion("COD_APLICACION"));
			strDocumento = this.fncObtenerStringDoc(documento);
		} catch (TransformerException e_getTokenAplicacion) {
			XlnetsUtils.logger.error(".getTokenAplicacion", e_getTokenAplicacion);
			throw new Exception("error.xlnets.getTokenAplicacion", e_getTokenAplicacion);
		}

		XlnetsUtils.logger.debug("getTokenAplicacion - Token:" + strDocumento);
		return strDocumento;
	}

	/**
	 * Metodo que realiza el login de aplicacion en XLNETs String: Parametro que
	 * determina si el login de aplicacion se realiza o se simula
	 * 
	 * @return String: Token de aplicación de XLNets
	 */
	public static Document getTokenAplicacionDocument() {

		XlnetsUtils.logger.info("getTokenAplicacion - EJIE");
		N38APISesion miApiSesion = new N38APISesion();
		Document appToken = miApiSesion.n38APISesionCrearApp(Constantes.CODIGO_APLICACION);
		return appToken;

	}

	/**
	 * Devuelve el String a partir de un Document.
	 * 
	 * @param doc
	 *            Document: El xml
	 * 
	 * @return the string
	 * @throws TransformerException
	 * @throws TransformerException
	 *             the exception
	 */
	public String fncObtenerStringDoc(Document doc) throws TransformerException {
		StringWriter sw;
		TransformerFactory tFactory = TransformerFactory.newInstance();
		Transformer transformer = tFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
		sw = new StringWriter();
		StreamResult result = new StreamResult(sw);
		transformer.transform(source, result);
		return sw.toString();

	}
}
