package com.ejie.ab63.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.ab63.comun.CargarPropiedades;
import com.ejie.ab63.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;
	}

	public String getTokenSession() throws Exception {
		String strDocumento = "";

		XlnetsUtils.logger.debug("Y41bUtils.getTokenSession - LOCAL");
		strDocumento = "<n38><elementos tipo=\"n38APISesionValida\"><elemento subtipo=\"N38Sesion\"><parametro id=\"objectClass\"><valor>top</valor><valor>n38Sesion</valor></parametro><parametro id=\"n38oleserver\"><valor>false</valor></parametro><parametro id=\"n38cadescripciondominio\"><valor>Desarrollo euskalsarea</valor></parametro><parametro id=\"n38listamsservidores\"><valor>hola Aitzi</valor><valor>NO</valor></parametro><parametro id=\"n38personauid\"><valor>AB63U001</valor></parametro><parametro id=\"n38valorhash\"><valor>0zUVCmaArGH8pmxQI5Tm5NRODI8=</valor></parametro><parametro id=\"n38idcontexto\"><valor>internet</valor><valor>RC</valor><valor>intranet</valor><valor>RasRC</valor><valor>Authentication-Asserter=XLNetS</valor><valor>Authentication-Method=Usuario-Password</valor></parametro><parametro id=\"objectclass\"><valor>top</valor><valor>n38Sesion</valor></parametro><parametro id=\"n38loginasociado\"><valor>https://xlnets.servicios.des.ejgv.euskalsarea.eus:443/n38a/N38LoginInicioServlet</valor></parametro><parametro id=\"n38fechalogoff\"><valor>1570085004833</valor></parametro><parametro id=\"n38fhum\"><valor>1570543839870</valor></parametro><parametro id=\"n38puestouid\"><valor>AB63-01</valor></parametro><parametro id=\"n38fechainicio\"><valor>1570515286169</valor></parametro><parametro id=\"dni\"><valor>AB63U001</valor></parametro><parametro id=\"n38login\"><valor>AB63-01</valor></parametro><parametro id=\"n38tiposesion\"><valor>C/S</valor></parametro><parametro id=\"n38comportamientoip\"><valor>ipv</valor></parametro><parametro id=\"n38sistemaxlnetsuid\"><valor>desarrollo-produccion</valor></parametro><parametro id=\"n38cadenaconfianza\"><valor>desarrollo-produccion</valor></parametro><parametro id=\"n38comportamientofirma\"><valor>False</valor></parametro><parametro id=\"n38urlsredireccion\"><valor>https://xlnets.servicios.des.ejgv.euskalsarea.eus/n38nCDWar/N38NodoCDServlet</valor><valor>https://xlnets.servicios.des.ejgv.jaso/n38nCDWar/N38NodoCDServlet</valor><valor>http://xlnets.des.jakina.ejgvdns/n38nCDWar/N38NodoCDServlet</valor><valor>http://desant01.ejie/xlnets/Redireccionador.asp</valor><valor>http://xlnets.des.ej-gv.ejgvdns/n38nCDWar/N38NodoCDServlet</valor><valor>http://xlnets.servicios.jakina.ejiedes.net/n38nCDWar/N38NodoCDServlet</valor><valor>http://desant02.ejie.ejgvdns/n38nCDWar/N38NodoCDServlet.moko</valor><valor>https://xlnets.servicios.jakina.ejiedes.eus/n38nCDWar/N38NodoCDServlet</valor><valor>http://xlnets.des.euskadi.ejgvdns/n38nCDWar/N38NodoCDServlet</valor><valor>http://xlnets.des.gazteaukera.ejgvdns/n38nCDWar/N38NodoCDServlet</valor><valor>http://xlnets.des.vis-net.ejgvdns/n38nCDWar/N38NodoCDServlet</valor><valor>http://xlnets.des.osalan.ejgvdns/n38nCDWar/N38NodoCDServlet</valor><valor>http://xlnets.des.ejie1.ejgvdns/n38nCDWar/N38NodoCDServlet</valor></parametro><parametro id=\"n38grupoorganicouid\"><valor>500</valor></parametro><parametro id=\"n38direccionproxy\"><valor>http://www.servicios.comunes.ejiedes.net/proxy</valor></parametro><parametro id=\"n38listags\"><valor>x_v4_ss_des_11:47770:1000</valor><valor>x_v4_ss_des_21:47770:1000</valor><valor>x_v4_ss_des_12:47771:1000</valor><valor>x_v4_ss_des_22:47771:1000</valor></parametro><parametro id=\"n38dominioscookies\"><valor>.euskalsarea.eus</valor><valor>.ejgv.jaso</valor><valor>.jakina.ejgvdns</valor><valor>desant01.ejie</valor><valor>.ej-gv.ejgvdns</valor><valor>.ejiedes.net</valor><valor>.ejie.ejgvdns</valor><valor>.ejiedes.eus</valor><valor>.euskadi.ejgvdns</valor><valor>.gazteaukera.ejgvdns</valor><valor>.vis-net.ejgvdns</valor><valor>.osalan.ejgvdns</valor><valor>.ejie1.ejgvdns</valor></parametro><parametro id=\"n38urlsgsd\"><valor>https://xlnets.servicios.des.ejgv.euskalsarea.eus/n38nCDominioWar/N38GestorCDominioServlet</valor></parametro><parametro id=\"n38certificadopoliticas\"><valor>NO</valor></parametro><parametro id=\"n38urlportal\"><valor>https://xlnets.servicios.des.ejgv.euskalsarea.eus/n38a/N38servletPortal</valor></parametro><parametro id=\"n38crearsesionapp\"><valor>false</valor></parametro><parametro id=\"n38perfiles\"><valor>Publico</valor><valor>R01I-PF-1240</valor><valor>R01I-PF-1239</valor><valor>AB63-PF-0008</valor><valor>AB63-PF-0002</valor><valor>AB63-PF-0001</valor><valor>AB63-PF-0005</valor><valor>AB63-PF-0003</valor><valor>R01I-PF-0972</valor><valor>R01I-PF-0967</valor><valor>O75B-PF-0038</valor><valor>O75B-PF-0001</valor></parametro><parametro id=\"n38eudescripciondominio\"><valor>Desarrollo euskalsarea</valor></parametro><parametro id=\"n38rangoip\"><valor>172.22.200.</valor><valor>172.25.200.78</valor><valor>172.25.200.75</valor><valor>172.30.</valor><valor>172.25.200.51</valor><valor>172.25.203.</valor><valor>192.168.250.137</valor><valor>10.190.16.168</valor><valor>10.211.</valor><valor>10.168.200.</valor><valor>10.168.201.</valor><valor>10.168.202.</valor><valor>10.168.203.</valor><valor>10.168.204.</valor><valor>10.168.205.</valor><valor>10.168.206.</valor><valor>10.168.207.</valor><valor>10.168.176.</valor><valor>10.140.</valor><valor>10.201.</valor><valor>127.0.0.1</valor><valor>10.101.</valor><valor>10.172.</valor><valor>10.168.199.</valor></parametro><parametro id=\"n38exclusivo\"><valor>False</valor></parametro><parametro id=\"n38subjectcert\"><valor>NO</valor></parametro><parametro id=\"n38urlfinal\"><valor>https://www.euskadi.eus</valor></parametro><parametro id=\"n38reintentossesion\"><valor>1</valor></parametro><parametro id=\"n38direcciongrc\"><valor>http://xlnets.servicios.des.ejgv.euskalsarea.eus/n38rWar/N38rFachadaGRCServlet</valor></parametro><parametro id=\"n38listacede\"><valor>x_v4_cd_des_11:48880:1000</valor><valor>x_v4_cd_des_21:48880:1000</valor><valor>x_v4_cd_des_12:48881:1000</valor><valor>x_v4_cd_des_22:48881:1000</valor></parametro><parametro id=\"n38dominiouid\"><valor>D0_Euskalsarea01</valor></parametro><parametro id=\"iphostnumber\"><valor>10.201.243.98</valor></parametro><parametro id=\"n38servidoraudit\"><valor>x_auddes01:4560</valor></parametro><parametro id=\"n38idioma\"><valor>1</valor></parametro><parametro id=\"n38dominiocomuncookie\"><valor>.euskalsarea.eus</valor></parametro><parametro id=\"n38politicauid\"><valor>P1</valor></parametro><parametro id=\"n38organizacion\"><valor>500</valor></parametro><parametro id=\"n38uidsesionglobal\"><valor>desarrollo-produccion-1559516032232</valor></parametro><parametro id=\"cn\"><valor>AB63U0011558341678808</valor></parametro><parametro id=\"n38sexpiracion\"><valor>43200000</valor></parametro><parametro id=\"n38uidsesion\"><valor>1559516032232</valor></parametro><parametro id=\"n38b64thirdpartyassertion\"><valor>NO</valor></parametro><parametro id=\"n38orgunituid\"><valor>99000</valor></parametro><parametro id=\"n38urldispatcher\"><valor>https://xlnets.servicios.des.ejgv.euskalsarea.eus/n38nCDWar/N38GestorCDServlet</valor></parametro><parametro id=\"n38fechacreacion\"><valor>1558341678808</valor></parametro></elemento></elementos></n38>";

		XlnetsUtils.logger.debug("getTokenSession - 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();

	}
}
