package com.ejie.ad74a.util.pid;

import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.w3c.dom.Document;

import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.util.comun.UtilTokenXlnets;

import v90.padoc.client.V90IPadocClient;
import v90.padoc.client.V90PadocClient;
import v90.padoc.exception.V90PadocException;
import v90.padoc.stub.W43DfAttribute;
import v90.padoc.stub.W43DfContent;
import v90.padoc.stub.W43DfCore;
import v90.padoc.stub.W43DfDocument;
import v90.padoc.stub.W43DfFormat;
import v90.padoc.stub.W43DfGETContent;
import v90.padoc.stub.W43DfGETDocument;

/**
 * 
 * @author: IBERMATICA
 * 
 * 
 */

@Service(value = "pidWs")
public class Ad74aPIDws {

	private static final Logger LOGGER = LoggerFactory.getLogger(Ad74aPIDws.class);
	private static String AplicToken = "AD74A";
	private static String UserPid = "AD74A";

	@Autowired
	private Properties appConfiguration;

	public String put(String aplic, String nombreFichero, String rutaPif, String usuarioAlta) {

		String documentId = null;

		LOGGER.debug("Ad74aPIDws.put");

		String urlWsPid = this.appConfiguration.getProperty("webservice.pid.url");
		// String urlWsPid =
		// "http://svc.intra.integracion.jakina.ejiedes.net/ctxapp/w43dfPIDService";

		LOGGER.debug("URL WEBSERVICE PID: " + urlWsPid);
		long totalTime = 0;
		try {
			V90IPadocClient padocClient = V90PadocClient.getInstance();
			padocClient.configureClient(urlWsPid);
			for (int i = 0; i < 1; i++) {

				long lInitTimeMs = System.currentTimeMillis();
				padocClient.configureClient(urlWsPid);
				// sesion: siempre la de ac62b
				LOGGER.debug("Ad74aPIDws.SubirDocumento - Obtener Sesion Ad74a");
				Document aplicSession = UtilTokenXlnets.getTokenDocumentXLNets(AplicToken);
				LOGGER.debug("Ad74aPIDws.SubirDocumento - Obtener Token Ad74a");

				XmlDocument doc = new XmlDocument(aplicSession);
				String tokenSesion = doc.getStringText(false);
				// String tokenSesion = UtilTokenXlnets
				// .getTokenStringXLNets(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);

				// Documento W43DfDocument

				LOGGER.debug("Ad74aPIDws.SubirDocumento - W43DfDocument");
				W43DfDocument documentoPid = new W43DfDocument();
				documentoPid.setType("pid_d_teleasistencia");
				LOGGER.debug("Ad74aPIDws.SubirDocumento - W43DfFormat");
				W43DfFormat format = new W43DfFormat();
				LOGGER.debug("Ad74aPIDws.SubirDocumento - trocear Nombre");
				String[] troceadoNombre = nombreFichero.split("\\.");
				LOGGER.debug("Ad74aPIDws.SubirDocumento - trocear Nombre - trozo[0]: " + troceadoNombre[0]);
				LOGGER.debug("Ad74aPIDws.SubirDocumento - trocear Nombre - trozo[1]: " + troceadoNombre[1]);
				LOGGER.debug("Ad74aPIDws.SubirDocumento - trocear Nombre - Tama�o troceadoNombre : "
						+ troceadoNombre.length);
				String extensionFichero = troceadoNombre[troceadoNombre.length - 1];
				LOGGER.debug("Ad74aPIDws.SubirDocumento - extensionFichero: " + extensionFichero);
				// format.setExtension("pdf");
				format.setExtension(extensionFichero);
				LOGGER.debug("Ad74aPIDws.SubirDocumento - W43DfContent");
				W43DfContent content = new W43DfContent();
				content.setFormat(format);
				content.setPath(rutaPif);
				documentoPid.setContent(content);
				LOGGER.debug("Ad74aPIDws.SubirDocumento - W43DfAttribute");
				W43DfAttribute attribute = new W43DfAttribute();
				LOGGER.debug("Ad74aPIDws.SubirDocumento - W43DfAttribute - object_name");
				attribute.setKey("object_name");
				attribute.getValues().add(nombreFichero);
				documentoPid.getAttributes().add(attribute);

				LOGGER.debug("Ad74aPIDws.SubirDocumento - W43DfCore - owner");
				W43DfCore core = new W43DfCore();
				// core.setOwner(aplic);
				core.setOwner(UserPid);
				documentoPid.setCore(core);

				LOGGER.debug("Ad74aPIDws.SubirDocumento - W43DfAttribute - authors");
				attribute = new W43DfAttribute();
				attribute.setKey("authors");
				attribute.getValues().add(usuarioAlta);
				documentoPid.getAttributes().add(attribute);
				LOGGER.debug("Ad74aPIDws.SubirDocumento - SubirDoc");
				documentId = padocClient.addDocument(tokenSesion, documentoPid);
				LOGGER.debug("Ad74aPIDws.SubirDocumento - documentId:" + documentId.toString());
				long timeTaken = (System.currentTimeMillis() - lInitTimeMs);
				LOGGER.info("time-scenario: " + timeTaken);
				totalTime += timeTaken;

			}
		} catch (V90PadocException pde) {
			ManagerErrors.manageException(pde, "ERROR subiendo documento a PID");
			LOGGER.error("Ad74aPIDws.SubirDocumento - Excepcion: " + pde.toString(), pde);
		} catch (Exception e) {
			ManagerErrors.manageException(e, "ERROR subiendo documento  a PID");
			LOGGER.error("Ad74aPIDws.SubirDocumento - Excepcion: " + e.toString(), e);
		}
		LOGGER.info("time-TOTAL: " + totalTime);

		return documentId;

	}

	//
	public W43DfDocument get(String idPid, String rutaPif) {

		W43DfDocument documentId = null;

		LOGGER.debug("Ad74aPIDws.get");
		try {
			String urlWsPid = this.appConfiguration.getProperty("webservice.pid.url");

			LOGGER.debug("URL WEBSERVICE PID: " + urlWsPid);
			long totalTime = 0;
			LOGGER.debug("Ad74aPIDws.get - Configurar Cliente");
			V90IPadocClient padocClient = V90PadocClient.getInstance();
			padocClient.configureClient(urlWsPid);
			for (int i = 0; i < 1; i++) {
				try {
					long lInitTimeMs = System.currentTimeMillis();
					padocClient.configureClient(urlWsPid);
					// sesion: siempre la de ac62b
					LOGGER.debug("Ad74aPIDws.BajarDocumento - Obtener Sesion ac62b");
//					N38APISesion miAPISesion = new N38APISesion();
//
//					Document aplicSession = miAPISesion.n38APISesionCrearApp(AplicToken);
					LOGGER.debug("Ad74aPIDws.BajarDocumento - Obtener Token ac62b");

					// XmlDocument doc = new XmlDocument(aplicSession);
					// String token = doc.getStringText(false);
					String tokenSesion = UtilTokenXlnets
							.getTokenStringXLNets(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);

					LOGGER.debug("Ad74aPIDws.BajarDocumento - W43dfGETDocument");
					W43DfGETDocument documentoPid = new W43DfGETDocument();
					LOGGER.debug("Ad74aPIDws.BajarDocumento - W43dfGETDocument - Id");
					documentoPid.setId(idPid);
					LOGGER.debug("Ad74aPIDws.BajarDocumento - W43dfGETContent");
					W43DfGETContent datosContenido = new W43DfGETContent();
					LOGGER.debug("Ad74aPIDws.BajarDocumento - W43dfGETContent - Path");
					datosContenido.setPath(rutaPif);
					documentoPid.setContent(datosContenido);
					LOGGER.debug("Ad74aPIDws.BajarDocumento - BajarDoc");
					documentId = padocClient.getDocument(tokenSesion, documentoPid);
					LOGGER.debug("Ad74aPIDws.BajarDocumento - documentId:" + documentId.toString());
					System.out.println(documentId);

					long timeTaken = (System.currentTimeMillis() - lInitTimeMs);
					LOGGER.info("time-scenario: " + timeTaken);
					totalTime += timeTaken;

				} catch (V90PadocException pde) {
					System.out.println("Error en la invocacion: " + pde.toString());
					LOGGER.error("Ad74aPIDws.get - Excepcion: " + pde.toString(), pde);
				}
			}
			LOGGER.info("time-TOTAL: " + totalTime);
		} catch (Throwable thre) {
			thre.printStackTrace();
		} finally {

		}
		return documentId;
	}

	public boolean delete(String idPid) {

		LOGGER.debug("Ad74aPIDws.delete");
		try {

			String urlWsPid = this.appConfiguration.getProperty("webservice.pid.url");

			LOGGER.debug("Ad74aPIDws.delete - URL WEBSERVICE PID: " + urlWsPid);
			long totalTime = 0;
			LOGGER.debug("Ad74aPIDws.delete - Configurar Cliente");
			V90IPadocClient padocClient = V90PadocClient.getInstance();
			padocClient.configureClient(urlWsPid);
			for (int i = 0; i < 1; i++) {
				try {
					long lInitTimeMs = System.currentTimeMillis();
					padocClient.configureClient(urlWsPid);
					// sesion: siempre la de ac62b
					LOGGER.debug("Ad74aPIDws.delete - Obtener Sesion ac62b");
//					N38APISesion miAPISesion = new N38APISesion();
//
//					Document aplicSession = miAPISesion.n38APISesionCrearApp(AplicToken);
					LOGGER.debug("Ad74aPIDws.delete - Obtener Token ac62b");

					// XmlDocument doc = new XmlDocument(aplicSession);
					// String token = doc.getStringText(false);
					String tokenSesion = UtilTokenXlnets
							.getTokenStringXLNets(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);

					LOGGER.debug("Ad74aPIDws.EliminarDocumento - Id:" + idPid);

					padocClient.deleteDocument(tokenSesion, idPid);
					long timeTaken = (System.currentTimeMillis() - lInitTimeMs);
					LOGGER.info("time-scenario: " + timeTaken);
					totalTime += timeTaken;

				} catch (V90PadocException pde) {
					System.out.println("Error en la invocacion: " + pde.toString());
					LOGGER.error("Ad74aPIDws.EliminarDocumento - Excepcion: " + pde.toString(), pde);
				}
			}
			LOGGER.info("time-TOTAL: " + totalTime);
		} catch (Throwable thre) {
			thre.printStackTrace();
			return false;
		} finally {

		}
		return true;
	}

//	public HashMap BajarInfoPorOid(HashMap mapaBusqueda) {
//
//		LOGGER.debug("Ad74aPIDws.BajarInfoPorOid");
//		HashMap mapaVuelta = new HashMap();
//
////      V90PaginacionBean paginacionBean = (V90PaginacionBean)mapaBusqueda.get("paginacionBean");
////      mapaVuelta.put("paginacionBean", paginacionBean);
//		try {
//			// String UrlWebServicePid =
//			// Q70ListenerUtils.getApplicationProperty("WEBSERVICE_PID_URL");
//			String UrlWebServicePid = UtilsHolder.getConfiguracionUtils().getConfiguracion()
//					.getString("WEBSERVICE_PID_URL");
//			LOGGER.debug("MIURLLLLLLLL" + UrlWebServicePid);
//
//			V90IPadocClient padocClient = V90PadocClient.getInstance();
//			padocClient.configureClient(UrlWebServicePid);
//
//			try {
//				N38APISesion miAPISesion = new N38APISesion();
//				Document aplicSession = miAPISesion.n38APISesionCrearApp(AplicToken);
//				XmlDocument doc = new XmlDocument(aplicSession);
//				String token = doc.getStringText(false);
//
//				W43DfDocument docuVuelta = new W43DfDocument();
//				W43DfGETDocument getDocu = new W43DfGETDocument();
//
//				getDocu.getKeys().add("object_name");
//				getDocu.getKeys().add("r_creator_name"); // CREADOR
//				getDocu.getKeys().add("owner_name"); // PROPIETARIO
//				getDocu.getKeys().add("r_creation_date");
//
//				getDocu.setId((String) mapaBusqueda.get("oid"));
//				docuVuelta = padocClient.getDocument(token, getDocu);
//
//				List<W43DfAttribute> atributosVuelta = new ArrayList<W43DfAttribute>();
//				atributosVuelta = docuVuelta.getAttributes();
//
//				List mapReg = new ArrayList();
//				HashMap response = new HashMap();
//
//				response.put("oid", (String) docuVuelta.getId());
//				response.put("tipo", (String) docuVuelta.getType());
//				response.put("nomFichero", atributosVuelta.get(0).getValues());
//				response.put("creador", atributosVuelta.get(1).getValues());
//				response.put("propietario", atributosVuelta.get(2).getValues());
//				response.put("fecha", atributosVuelta.get(3).getValues());
//				mapReg.add(response);
//
//				mapaVuelta.put("numRegistros", 1);
//				mapaVuelta.put("datos", mapReg);
//
//				return mapaVuelta;
//
//			} catch (Exception e) {
//				LOGGER.debug("EEERRRRRR " + e);
//				List mapReg = new ArrayList();
//				HashMap responseVacio = new HashMap();
//				// mapReg.add(responseVacio);
//				mapaVuelta.put("numRegistros", 0);
//				mapaVuelta.put("datos", mapReg);
//			}
//
//		} catch (Throwable thre) {
//			thre.printStackTrace();
//			LOGGER.debug("EEERRRRRR " + thre);
//		} finally {
//
//		}
//		return mapaVuelta;
//	}

}