package com.ejie.ad74a.util.comun;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.transform.TransformerException;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.ejie.ad74a.constantes.Constantes;
import com.ejie.x38.security.UserCredentials;
import com.sun.org.apache.xpath.internal.XPathAPI;

import n38a.exe.N38APISesion;
import n38c.exe.N38API;

/**
 * Clase de utilidades de seguridad para recuperar el token de XLNets de una
 * aplicacion
 * 
 * @author PPE
 */
public final class UtilTokenXlnets {

	private static final Logger LOGGER = LoggerFactory.getLogger(UtilTokenXlnets.class);

//	public static final List<String> GRUPOS_TECNICOS = Arrays 
//			.asList(new String[] { "AD74A-GU-0002", "AD74A-GU-0006", "AD74A-GU-0004", "AD74A-GU-0005" });
	public static final List<String> GRUPOS_TECNICOS = Arrays.asList(new String[] { "AD74A-GU-0001" });

	/**
	 * 'UtilTokenXlnets'
	 */
	private UtilTokenXlnets() {
	}

	/**
	 * Devuelve un String con el token de sesion
	 * 
	 * @param idAplic {@link String}
	 * @return {@link String}
	 */
	public static String getTokenStringXLNets(String idAplic) {
		UtilTokenXlnets.LOGGER.trace("getTokenStringXLNets INI {}", idAplic);
		String token = "";
		try {
			token = UtilidadesXML.parseDocument2String(UtilTokenXlnets.getTokenDocumentXLNets(idAplic));
		} catch (Exception e) {
			UtilTokenXlnets.LOGGER.error("getTokenDocumentXLNets", e);
		}

		UtilTokenXlnets.LOGGER.trace("getTokenStringXLNets Resultado: {}", token);
		return token;
	}

	/**
	 * Devuelve un objeto Document con el token de sesion
	 * 
	 * @param idAplic {@link String}
	 * @return {@link String}
	 */
	public static Document getTokenDocumentXLNets(String idAplic) {
		UtilTokenXlnets.LOGGER.trace("getTokenDocumentXLNets INI {}", idAplic);
		Document token = null;

		try {
			if (UtilSeguridad.esEntornoLocal()) {
				UtilTokenXlnets.LOGGER.trace("getTokenDocumentXLNets En oficina");
				token = UtilidadesXML.string2Document(
						"<n38><elementos tipo=\"n38APISesionCrearToken\"><elemento subtipo=\"N38Sesion\"><parametro id=\"dni\"><valor>AD74A</valor></parametro><parametro id=\"n38dominiocomuncookie\"><valor>.jakina.ejgvdns</valor></parametro><parametro id=\"n38b64thirdpartyassertion\"><valor>NO</valor></parametro><parametro id=\"n38urldispatcher\"><valor>http://xlnets.servicios.jakina.ejiedes.net/n38nWar/N38DispatcherEstrellaServlet</valor></parametro><parametro id=\"n38uidsesion\"><valor>1670972788414</valor></parametro><parametro id=\"n38listacede\"><valor>x_v4_cd_des_11.ejgvdns:48880:1000</valor><valor>x_v4_cd_des_21.ejgvdns:48880:1000</valor><valor>x_v4_cd_des_12.ejgvdns:48881:1000</valor><valor>x_v4_cd_des_22.ejgvdns:48881:1000</valor></parametro><parametro id=\"n38idioma\"><valor>3</valor></parametro><parametro id=\"n38urlsgsd\"><valor>https://xlnets.servicios.jakina.ejiedes.net/n38nCDominioWar/N38GestorCDominioServlet</valor></parametro><parametro id=\"n38dominiouid\"><valor>D0_Servidores11</valor></parametro><parametro id=\"n38subjectcert\"><valor>NO</valor></parametro><parametro id=\"n38comportamientofirma\"><valor>False</valor></parametro><parametro id=\"n38fhum\"><valor>1736419487064</valor></parametro><parametro id=\"n38cadenaconfianza\"><valor>desarrollo-produccion</valor></parametro><parametro id=\"n38fechainicio\"><valor>1736406347879</valor></parametro><parametro id=\"n38reintentossesion\"><valor>1</valor></parametro><parametro id=\"n38urlsredireccion\"><valor>http://xlnets.servicios.jakina.ejiedes.net/n38nWar/N38NodoEstrellaServlet</valor></parametro><parametro id=\"n38comportamientoip\"><valor>ipv</valor></parametro><parametro id=\"n38loginasociado\"><valor>https://xlnets.servicios.jakina.ejiedes.net:443/n38a/N38LoginInicioServlet</valor></parametro><parametro id=\"n38idcontexto\"><valor>intranet</valor><valor>internet</valor><valor>BUS-Internet</valor><valor>servidores</valor><valor>Authentication-Asserter=XLNetS</valor><valor>Authentication-Method=Usuario-Password</valor></parametro><parametro id=\"n38sistemaxlnetsuid\"><valor>desarrollo-produccion</valor></parametro><parametro id=\"n38urlfinal\"><valor>http://jakina</valor></parametro><parametro id=\"n38personauid\"><valor>AD74A</valor></parametro><parametro id=\"n38orgunituid\"><valor>10500</valor></parametro><parametro id=\"n38valorhash\"><valor>Kqc6TbzC5M3y/vsa1/yel0ADvro=</valor></parametro><parametro id=\"n38certificadopoliticas\"><valor>NO</valor></parametro><parametro id=\"n38listags\"><valor>x_v4_ss_des_11.ejgvdns:47770:1000</valor><valor>x_v4_ss_des_21.ejgvdns:47770:1000</valor><valor>x_v4_ss_des_12.ejgvdns:47771:1000</valor><valor>x_v4_ss_des_22.ejgvdns:47771:1000</valor></parametro><parametro id=\"n38cadescripciondominio\"><valor>ras internete</valor></parametro><parametro id=\"n38direcciongrc\"><valor>http://xlnets.servicios.jakina.ejiedes.net/n38rWar/N38rFachadaGRCServlet</valor></parametro><parametro id=\"n38uidsesionglobal\"><valor>desarrollo-produccion-1670972788414</valor></parametro><parametro id=\"iphostnumber\"><valor>172.18.145.80</valor></parametro><parametro id=\"n38direccionproxy\"><valor>http://www.servicios.comunes.ejiedes.net/proxy</valor></parametro><parametro id=\"n38crearsesionapp\"><valor>true</valor></parametro><parametro id=\"n38politicauid\"><valor>P2</valor></parametro><parametro id=\"n38puestouid\"><valor>AD74A</valor></parametro><parametro id=\"n38exclusivo\"><valor>False</valor></parametro><parametro id=\"n38tiposesion\"><valor>C/S</valor></parametro><parametro id=\"n38ultimoiniciosesion\"><valor>1736190000185</valor></parametro><parametro id=\"n38oleserver\"><valor>false</valor></parametro><parametro id=\"n38dominioscookies\"><valor>.jakina.ejgvdns</valor></parametro><parametro id=\"n38servidoraudit\"><valor>x_auddes01.ejgvdns:4560</valor></parametro><parametro id=\"n38rangoip\"><valor>172.18.163.223</valor><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><valor>10.190.20.67</valor><valor>10.170.16.172</valor><valor>10.190.20.100</valor><valor>10.190.20.102</valor><valor>10.190.20.63</valor><valor>10.190.20.64</valor><valor>10.170.17.203</valor><valor>10.170.17.207</valor><valor>10.190.20.101</valor><valor>10.190.28.18</valor><valor>10.190.20.71</valor><valor>10.190.20.138</valor><valor>10.190.20.139</valor><valor>10.190.20.86</valor><valor>10.170.18.235</valor><valor>10.190.16.12</valor><valor>10.170.18.230</valor><valor>10.190.28.28</valor><valor>10.190.20.175</valor><valor>10.190.20.177</valor><valor>10.190.20.179</valor><valor>10.190.20.181</valor><valor>10.190.20.183</valor><valor>10.190.20.185</valor><valor>10.190.20.191</valor><valor>10.190.20.193</valor><valor>10.190.40.46</valor><valor>10.190.40.48</valor><valor>10.190.40.38</valor><valor>10.190.40.40</valor><valor>10.190.20.197</valor><valor>10.190.20.195</valor><valor>10.190.40.42</valor><valor>10.190.40.44</valor><valor>10.190.16.31</valor><valor>10.190.20.189</valor><valor>10.190.20.190</valor><valor>10.190.20.215</valor><valor>10.190.20.217</valor><valor>10.190.20.219</valor><valor>10.190.20.221</valor><valor>10.190.20.199</valor><valor>10.190.20.201</valor><valor>10.190.20.203</valor><valor>10.190.20.205</valor><valor>10.190.28.11</valor><valor>10.190.28.24</valor><valor>10.190.21.111</valor><valor>10.190.28.101</valor><valor>10.190.21.24</valor><valor>10.190.21.26</valor><valor>10.190.21.20</valor><valor>10.190.21.22</valor><valor>10.190.21.113</valor><valor>10.190.40.66</valor><valor>10.190.21.17</valor><valor>10.190.20.49</valor><valor>10.190.21.16</valor><valor>10.190.21.18</valor><valor>10.190.20.60</valor><valor>10.190.21.36</valor><valor>10.168.212.21</valor><valor>10.1.1.</valor><valor>10.190.21.27</valor><valor>10.190.20.209</valor><valor>10.190.20.207</valor><valor>10.190.20.169</valor><valor>10.190.21.82</valor><valor>10.190.21.81</valor><valor>10.190.21.83</valor><valor>10.190.21.80</valor><valor>10.190.21.89</valor><valor>10.190.21.85</valor><valor>10.190.28.35</valor><valor>10.190.21.87</valor><valor>10.190.20.253</valor><valor>10.190.20.26</valor><valor>10.190.20.27</valor><valor>10.190.20.251</valor><valor>10.190.16.55</valor><valor>1.1.1.1</valor><valor>10.190.21.93</valor><valor>10.190.21.95</valor><valor>10.190.28.111</valor><valor>10.190.21.91</valor><valor>10.190.28.113</valor><valor>10.190.20.45</valor><valor>10.190.21.15</valor><valor>10.190.21.14</valor><valor>10.190.21.97</valor><valor>10.190.21.105</valor><valor>10.190.20.42</valor><valor>10.190.21.103</valor><valor>10.168.214.65</valor><valor>10.168.214.66</valor><valor>10.190.28.103</valor><valor>10.190.21.61</valor><valor>10.190.21.67</valor><valor>10.190.21.63</valor><valor>10.190.21.65</valor><valor>10.190.20.233</valor><valor>10.190.28.136</valor><valor>10.190.16.136</valor><valor>10.190.16.135</valor><valor>10.190.20.239</valor><valor>10.190.20.238</valor><valor>10.190.20.237</valor><valor>10.190.20.235</valor><valor>10.190.21.70</valor><valor>10.190.21.72</valor><valor>10.190.28.134</valor><valor>10.190.28.22</valor><valor>10.190.21.74</valor><valor>10.190.8.164</valor><valor>10.190.21.76</valor><valor>10.190.28.25</valor><valor>10.190.20.245</valor><valor>10.190.20.244</valor><valor>10.190.20.243</valor><valor>10.190.20.242</valor><valor>10.190.20.241</valor><valor>10.190.20.240</valor><valor>10.190.20.249</valor><valor>10.190.20.247</valor><valor>10.190.20.246</valor><valor>10.190.21.40</valor><valor>10.190.21.47</valor><valor>10.190.21.42</valor><valor>10.190.20.211</valor><valor>10.190.21.8</valor><valor>10.190.21.38</valor><valor>10.190.21.3</valor><valor>10.190.21.4</valor><valor>10.190.21.1</valor><valor>10.190.20.213</valor><valor>10.190.8.102</valor><valor>10.190.21.57</valor><valor>10.190.21.59</valor><valor>10.190.20.180</valor><valor>10.190.21.53</valor><valor>10.190.21.55</valor><valor>10.190.20.223</valor><valor>10.190.40.68</valor><valor>10.190.20.187</valor><valor>10.190.20.229</valor><valor>10.190.20.227</valor><valor>10.190.20.225</valor><valor>10.190.21.144</valor><valor>10.190.21.145</valor><valor>10.190.21.146</valor><valor>10.190.21.147</valor><valor>10.190.28.226</valor><valor>172.26.128.123</valor><valor>10.190.28.194</valor><valor>10.190.21.121</valor><valor>10.190.21.122</valor><valor>10.190.21.123</valor><valor>10.190.21.124</valor><valor>10.190.21.148</valor><valor>10.190.28.200</valor><valor>10.190.28.182</valor><valor>10.190.28.44</valor><valor>10.190.28.218</valor><valor>10.190.28.36</valor><valor>10.190.28.223</valor><valor>10.190.28.219</valor><valor>10.190.28.224</valor><valor>10.190.28.225</valor><valor>10.190.28.227</valor><valor>10.190.28.221</valor><valor>10.190.28.180</valor><valor>10.190.28.183</valor><valor>10.190.28.195</valor><valor>10.190.28.230</valor><valor>10.190.28.202</valor><valor>10.190.28.204</valor><valor>10.190.28.184</valor><valor>10.190.28.186</valor><valor>10.168.214.68</valor><valor>10.190.28.181</valor><valor>10.190.28.246</valor><valor>10.190.28.245</valor><valor>10.190.28.247</valor><valor>10.190.28.220</valor><valor>10.190.28.228</valor><valor>10.190.28.249</valor><valor>10.190.28.88</valor><valor>10.190.28.85</valor><valor>10.190.8.169</valor><valor>10.168.212.25</valor><valor>10.190.21.137</valor><valor>10.190.21.154</valor><valor>10.190.21.156</valor><valor>10.190.21.160</valor><valor>10.190.21.161</valor><valor>10.190.21.162</valor><valor>10.190.21.163</valor><valor>10.190.21.164</valor><valor>10.190.21.165</valor><valor>10.190.21.158</valor><valor>10.128.</valor><valor>10.129.</valor><valor>10.130.</valor><valor>10.131.</valor><valor>10.190.21.176</valor><valor>10.190.21.177</valor><valor>10.190.28.179</valor><valor>10.190.28.191</valor><valor>10.190.20.8</valor><valor>10.168.65.65</valor><valor>10.190.21.78</valor><valor>10.190.16.198</valor><valor>10.190.21.32</valor><valor>10.190.8.3</valor><valor>10.190.8.5</valor><valor>10.190.80.5</valor><valor>172.16.52.214</valor><valor>10.168.212.77</valor><valor>10.190.28.240</valor><valor>10.190.20.31</valor><valor>10.190.80.118</valor><valor>10.190.21.184</valor><valor>10.190.21.186</valor><valor>10.190.20.133</valor><valor>10.190.20.134</valor><valor>10.190.80.27</valor><valor>10.190.80.31</valor><valor>10.190.80.28</valor><valor>10.190.80.138</valor><valor>10.190.80.169</valor><valor>10.190.80.170</valor><valor>10.190.21.125</valor><valor>10.190.21.126</valor><valor>10.190.80.186</valor><valor>10.190.80.187</valor><valor>10.190.21.206</valor><valor>10.190.21.208</valor><valor>10.190.21.210</valor><valor>10.190.21.212</valor><valor>10.190.21.198</valor><valor>10.190.21.200</valor><valor>10.190.21.202</valor><valor>10.190.21.204</valor><valor>10.190.80.233</valor><valor>10.190.80.234</valor><valor>10.190.80.206</valor><valor>10.190.80.207</valor><valor>10.190.28.17</valor><valor>10.190.21.196</valor><valor>10.190.21.197</valor><valor>10.190.80.219</valor><valor>10.190.80.220</valor><valor>10.190.80.221</valor><valor>10.190.80.222</valor><valor>10.190.80.215</valor><valor>10.190.80.216</valor><valor>10.190.80.217</valor><valor>10.190.80.218</valor><valor>10.190.80.209</valor><valor>10.190.80.210</valor><valor>10.190.80.30</valor><valor>10.190.80.35</valor><valor>172.18.135.122</valor><valor>172.18.135.121</valor><valor>10.190.80.255</valor><valor>10.190.81.0</valor><valor>10.190.80.244</valor><valor>10.190.80.245</valor><valor>10.190.80.243</valor><valor>10.190.80.247</valor><valor>10.190.80.248</valor><valor>10.190.80.249</valor><valor>10.190.80.242</valor><valor>10.190.80.250</valor><valor>10.190.80.192</valor><valor>10.190.80.204</valor><valor>10.190.81.88</valor><valor>10.190.81.87</valor><valor>10.190.81.115</valor><valor>10.190.81.116</valor><valor>172.18.155.131</valor><valor>10.190.81.131</valor><valor>10.190.81.132</valor><valor>10.190.80.197</valor><valor>10.190.80.198</valor><valor>172.18.137.6</valor><valor>10.190.81.133</valor><valor>10.190.81.135</valor><valor>10.168.212.203</valor><valor>10.190.80.150</valor><valor>10.168.212.204</valor><valor>10.168.212.205</valor><valor>10.190.81.90</valor><valor>10.190.81.91</valor><valor>10.190.81.93</valor><valor>10.190.81.92</valor><valor>10.190.81.94</valor><valor>10.190.80.229</valor><valor>10.190.80.230</valor><valor>10.190.80.231</valor><valor>10.190.80.232</valor><valor>10.190.80.151</valor><valor>10.190.81.89</valor><valor>10.190.21.10</valor><valor>10.190.21.11</valor><valor>10.190.81.125</valor><valor>10.190.81.126</valor><valor>10.190.81.102</valor><valor>10.190.81.127</valor><valor>10.190.81.129</valor><valor>172.18.139.78</valor><valor>10.190.81.165</valor><valor>10.190.81.166</valor><valor>10.190.80.227</valor><valor>10.190.80.228</valor><valor>10.190.80.158</valor><valor>10.190.80.157</valor><valor>10.190.81.157</valor><valor>10.190.81.182</valor><valor>10.190.81.183</valor><valor>172.18.137.125</valor><valor>172.18.137.126</valor><valor>10.190.80.123</valor><valor>10.190.81.184</valor><valor>10.190.81.186</valor><valor>10.190.81.198</valor><valor>10.190.81.199</valor><valor>10.190.81.153</valor><valor>10.190.81.152</valor><valor>10.190.81.221</valor><valor>10.190.81.222</valor><valor>10.190.81.223</valor><valor>10.190.81.224</valor><valor>10.190.81.225</valor><valor>10.190.81.226</valor><valor>10.190.81.231</valor><valor>10.190.81.177</valor><valor>10.190.81.201</valor><valor>10.190.81.203</valor><valor>10.190.81.204</valor><valor>10.190.81.205</valor><valor>10.190.81.207</valor><valor>10.190.81.213</valor><valor>10.190.81.214</valor><valor>10.190.81.215</valor><valor>10.190.81.216</valor><valor>10.190.81.209</valor><valor>10.190.81.211</valor><valor>10.190.81.251</valor><valor>10.190.81.253</valor><valor>172.18.140.69</valor><valor>172.18.140.65</valor><valor>172.18.133.112</valor><valor>172.18.133.114</valor><valor>172.18.140.59</valor><valor>172.18.140.60</valor><valor>172.18.140.62</valor><valor>172.18.140.61</valor><valor>172.18.140.64</valor><valor>172.18.140.63</valor><valor>10.190.81.255</valor><valor>172.18.141.17</valor><valor>10.190.82.1</valor><valor>172.18.141.19</valor><valor>172.18.139.12</valor><valor>172.18.139.145</valor><valor>10.190.82.8</valor><valor>10.190.82.10</valor><valor>172.18.141.63</valor><valor>172.18.141.64</valor><valor>172.18.141.65</valor><valor>172.18.141.68</valor><valor>10.190.82.11</valor><valor>10.190.82.12</valor><valor>172.18.135.86</valor><valor>172.18.135.44</valor><valor>10.190.82.19</valor><valor>10.190.82.18</valor><valor>172.18.141.176</valor><valor>172.18.141.177</valor><valor>10.168.212.22</valor><valor>10.168.113.193</valor><valor>10.190.81.193</valor><valor>10.190.81.194</valor><valor>10.190.82.7</valor><valor>172.18.138.221</valor><valor>10.190.82.66</valor><valor>172.18.142.209</valor><valor>10.190.82.69</valor><valor>172.18.142.215</valor><valor>10.190.82.70</valor><valor>172.18.142.216</valor><valor>172.18.139.211</valor><valor>172.18.139.212</valor><valor>10.190.81.103</valor><valor>172.18.138.125</valor><valor>10.190.81.104</valor><valor>172.18.138.126</valor><valor>172.18.142.97</valor><valor>10.190.82.34</valor><valor>172.18.142.91</valor><valor>10.190.81.243</valor><valor>172.18.138.46</valor><valor>10.190.82.80</valor><valor>172.18.135.202</valor><valor>172.26.139.92</valor><valor>172.16.64.81</valor><valor>172.16.64.83</valor><valor>172.16.64.16</valor><valor>172.16.64.75</valor><valor>10.190.82.149</valor><valor>172.18.143.226</valor><valor>172.18.139.54</valor><valor>172.18.139.53</valor><valor>10.190.81.150</valor><valor>10.168.116.1</valor><valor>10.190.82.197</valor><valor>172.18.145.150</valor><valor>10.190.82.150</valor><valor>172.18.145.1</valor><valor>10.190.82.88</valor><valor>172.18.140.15</valor><valor>10.190.82.64</valor><valor>172.18.142.202</valor><valor>172.18.138.80</valor><valor>172.18.135.2</valor><valor>10.190.82.223</valor><valor>172.18.146.4</valor><valor>10.190.82.234</valor><valor>10.190.82.235</valor><valor>10.190.82.227</valor><valor>172.18.146.47</valor><valor>10.190.82.240</valor><valor>10.190.82.241</valor><valor>172.18.147.29</valor><valor>10.190.82.75</valor><valor>172.18.164.24</valor><valor>172.18.164.25</valor><valor>172.18.145.83</valor><valor>172.18.145.80</valor><valor>10.190.82.24</valor><valor>172.18.143.217</valor><valor>10.190.82.97</valor><valor>172.18.143.218</valor><valor>10.190.82.250</valor><valor>10.190.82.251</valor><valor>172.18.146.149</valor><valor>172.18.146.152</valor><valor>172.18.147.143</valor><valor>10.190.83.10</valor><valor>172.18.147.184</valor><valor>10.190.83.16</valor><valor>172.18.145.107</valor><valor>10.190.82.165</valor><valor>10.190.81.118</valor><valor>172.18.147.154</valor><valor>10.190.83.5</valor><valor>10.190.82.37</valor><valor>172.18.146.145</valor><valor>10.190.80.205</valor><valor>10.190.83.102</valor><valor>10.190.82.186</valor><valor>10.190.82.185</valor><valor>10.190.82.184</valor><valor>172.18.152.115</valor><valor>172.18.152.121</valor><valor>172.18.152.107</valor><valor>10.190.83.98</valor><valor>172.18.163.218</valor><valor>10.190.83.76</valor><valor>172.18.163.97</valor><valor>10.190.83.74</valor><valor>172.18.163.98</valor><valor>10.190.81.238</valor><valor>172.18.163.24</valor><valor>10.190.83.89</valor><valor>172.18.164.30</valor><valor>10.190.83.143</valor><valor>10.190.83.144</valor><valor>172.18.152.102</valor><valor>172.16.64.157</valor><valor>10.190.82.170</valor><valor>10.190.82.177</valor><valor>172.18.151.245</valor><valor>172.18.151.244</valor><valor>10.190.82.179</valor><valor>172.18.152.46</valor><valor>10.200.208.216</valor><valor>172.18.152.48</valor><valor>172.16.64.163</valor><valor>172.18.131.76</valor><valor>172.16.64.164</valor><valor>172.18.164.187</valor><valor>10.190.83.127</valor><valor>172.18.142.135</valor></parametro><parametro id=\"n38organizacion\"><valor>400</valor></parametro><parametro id=\"n38grupoorganicouid\"><valor>400</valor></parametro><parametro id=\"n38login\"><valor>AD74A</valor></parametro><parametro id=\"n38listamsservidores\"><valor>hola Aitzi</valor><valor>NO</valor><valor>1##adfs-1##ejgvnet</valor></parametro><parametro id=\"objectClass\"><valor>n38Sesion</valor><valor>top</valor></parametro><parametro id=\"cn\"><valor>ad74a1669977350455</valor></parametro><parametro id=\"n38perfiles\"><valor>Publico</valor><valor>AE01B-PF-0003</valor><valor>AE01B-PF-0001</valor><valor>AD74A-PF-0011</valor><valor>AD74A-PF-0002</valor><valor>AD74A-PF-0013</valor><valor>AD74A-PF-0001</valor><valor>AD74A-PF-0010</valor><valor>AB57B-PF-0001</valor><valor>AA66-PF-0007</valor><valor>Y50B-PF-0004</valor></parametro><parametro id=\"n38eudescripciondominio\"><valor>rak Interneta</valor></parametro><parametro id=\"n38sexpiracion\"><valor>43200000</valor></parametro><parametro id=\"n38urlportal\"><valor>https://xlnets.servicios.jakina.ejiedes.net/n38a/N38servletPortal</valor></parametro><parametro id=\"n38fechalogoff\"><valor>1734970001100</valor></parametro><parametro id=\"n38fechacreacion\"><valor>1669977350455</valor></parametro></elemento></elementos></n38>");
			} else {
				UtilTokenXlnets.LOGGER.trace("getTokenDocumentXLNets En desarrollo");
				N38APISesion miAPISesion = new N38APISesion();
				token = miAPISesion.n38APISesionCrearApp(idAplic);
			}
		} catch (Exception e) {
			UtilTokenXlnets.LOGGER.error("getTokenDocumentXLNets", e);
		}
		if (UtilTokenXlnets.LOGGER.isTraceEnabled()) {
			UtilTokenXlnets.LOGGER.trace("getTokenDocumentXLNets Resultado: {}",
					UtilidadesXML.parseDocument2String(token));
		}
		return token;
	}

	/**
	 * Obtiene la lista de tecnicos
	 * 
	 * @return
	 * @throws Exception
	 */
	public static Map<String, String> getListTecnicos() throws Exception {

		Document sesionToken = getTokenDocumentXLNets(Constantes.COD_APLICACION);
		N38API n38API = new N38API(sesionToken);

		Map<String, String> listaTecnicos = new HashMap<>();

		for (int i = 0; i < GRUPOS_TECNICOS.size(); i++) {
			String grupo = GRUPOS_TECNICOS.get(i);
			Document docPuestos = n38API.n38ItemGrupoPuestos(grupo);
			String[] puestoUID = obtenerValorNodosXPath(docPuestos,
					"//elemento[@subtipo='n38puesto']/parametro[@id='n38uidpuesto']/valor/text()");
			if (puestoUID != null && puestoUID.length > 0) {
				for (int j = 0; j < puestoUID.length; j++) {
					LOGGER.info("Puesto supervisor {}", puestoUID[j]);
					if (!puestoUID[j].equals("")) {
						Document docPersona = n38API.n38ItemObtenerPersonas("n38puestouid=" + puestoUID[j]);
						try {
							String[] dni = obtenerValorNodosXPath(docPersona,
									"//elemento[@subtipo='n38persona']/parametro[@id='dni']/valor/text()");

							if (dni != null && dni.length > 0) {
								if (dni.length == 1) {
									LOGGER.info("Mail supervisor {}", dni[0]);
									String[] displayname = obtenerValorNodosXPath(docPersona,
											"//elemento[@subtipo='n38persona']/parametro[@id='displayname']/valor/text()");
									if (null != displayname && displayname.length > 0) {
										listaTecnicos.put(dni[0], displayname[0]);
									}
								} else {
									for (int x = 0; x < dni.length; x++) {
										LOGGER.info("Mas de un supervisor por puesto {}", dni[x]);
										Document docPersonaTemp = n38API.n38ItemObtenerPersonas("dni=" + dni[x]);
										String[] displayname = obtenerValorNodosXPath(docPersonaTemp,
												"//elemento[@subtipo='n38persona']/parametro[@id='displayname']/valor/text()");
										listaTecnicos.put(dni[x], displayname[0]);
									}
								}
							}
						} catch (Exception e) {
							LOGGER.error("getSupervisoresMail: ERROR: " + e.getMessage(), e);
						}
					}
				}
			}
		}

		return listaTecnicos;
	}

	public static String[] obtenerValorNodosXPath(Document documentoCS, String xpath) throws TransformerException {
		String[] pathsFunciones = null;
		NodeList parametros = XPathAPI.selectNodeList(documentoCS, xpath);
		pathsFunciones = new String[parametros.getLength()];
		for (int i = 0; i < parametros.getLength(); i++) {
			String aux;
			Node paramPath = parametros.item(i);
			if (paramPath != null) {
				aux = paramPath.getNodeValue();
			} else {
				aux = "";
			}
			pathsFunciones[i] = aux;
		}
		return pathsFunciones;
	}

	/**
	 * Obtiene el codigo de puesto de un usuario (IE..., CO..., EJ...), dado su UID
	 * o su DNI
	 * 
	 * @param uidOrDni el codigo UID del usuario o su DNI
	 * @return n38puestouid
	 * @throws Exception
	 */
	public static String getPuestoUsuario(String uidOrDni) {
		final String xpathPuestoExpr = "//elemento[@subtipo='n38persona']/parametro[@id='n38puestouid']/valor/text()";
		if (StringUtils.isBlank(uidOrDni)) {
			return null;
		}
		String puesto = null;
		Document sesionToken = getTokenDocumentXLNets(Constantes.COD_APLICACION);
		N38API n38API = new N38API(sesionToken);
		try {
			Document resp = n38API.n38ItemObtenerPersonas("dni=" + uidOrDni);// Busqueda por DNI
			String[] resultado = obtenerValorNodosXPath(resp, xpathPuestoExpr);
			if (resultado.length <= 0) {
				resp = n38API.n38ItemObtenerPersonas("uid=" + uidOrDni);// Busqueda por UID (login)
				resultado = obtenerValorNodosXPath(resp, xpathPuestoExpr);
			}
			if (resultado.length > 0) {
				puesto = resultado[0];
			}

		} catch (TransformerException e) {
			LOGGER.warn("Error al obtener puesto de la persona", e);
		}
		return puesto;
	}

	public static ArrayList<String> getMailListByGroup() throws Exception {

		// TODO hacer el metodo en funcion al grupo
		Document sesionToken = getTokenDocumentXLNets(Constantes.COD_APLICACION);
		N38API n38API = new N38API(sesionToken);

		// recuperamos grupo de user conectado
		UserCredentials credential = UtilSeguridad.getUsuarioConectado();
		String positicion = credential.getPosition();
		Document docGrupos = n38API.n38ItemPuestoGrupos(positicion);
		String[] gruposUID = obtenerValorNodosXPath(docGrupos,
				"//elemento[@subtipo='n38grupoUsuarios']/parametro[@id='n38uidgrupousuarios']/valor/text()");
		ArrayList<String> emailsSupervisor = new ArrayList<String>();

		for (String grupo : gruposUID) {
			if (grupo.startsWith(Constantes.COD_APLICACION)) {
				Document docPuestos = n38API.n38ItemGrupoPuestos(grupo);
				String[] puestoUID = obtenerValorNodosXPath(docPuestos,
						"//elemento[@subtipo='n38puesto']/parametro[@id='n38uidpuesto']/valor/text()");
				if (puestoUID != null && puestoUID.length > 0) {
					for (int i = 0; i < puestoUID.length; i++) {
						LOGGER.info("Puesto supervisor {}", puestoUID[i]);
						if (!puestoUID[i].equals("")) {
							Document docPersona = n38API.n38ItemObtenerPersonas("n38puestouid=" + puestoUID[i]);
							try {
								String[] mail = obtenerValorNodosXPath(docPersona,
										"//elemento[@subtipo='n38persona']/parametro[@id='mail']/valor/text()");
								if (mail != null && mail.length > 0) {
									LOGGER.info("Mail supervisor {}", mail[0]);
									emailsSupervisor.add(mail[0]);
								}
							} catch (Exception e) {
								LOGGER.error("getSupervisoresMail: ERROR: " + e.getMessage(), e);
							}
						}
					}
				}
			}
		}

		return emailsSupervisor;
	}

	public static ArrayList<String> getMailByTecnico(ArrayList<String> tecnicosTo) throws Exception {
		Document sesionToken = getTokenDocumentXLNets(Constantes.COD_APLICACION);
		N38API n38API = new N38API(sesionToken);
		ArrayList<String> emailsSupervisor = new ArrayList<String>();

		for (String tecnico : tecnicosTo) {
			Document docPersona = n38API.n38ItemObtenerPersonas("uid=" + tecnico);
			try {
				String[] mail = obtenerValorNodosXPath(docPersona,
						"//elemento[@subtipo='n38persona']/parametro[@id='mail']/valor/text()");
				if (mail != null && mail.length > 0) {
					LOGGER.info("Mail supervisor {}", mail[0]);
					emailsSupervisor.add(mail[0]);
				}
			} catch (Exception e) {
				LOGGER.error("getMailByTecnico: ERROR: " + e.getMessage(), e);
			}
		}

		return emailsSupervisor;
	}

}