package com.ejie.ad74a.async;

import java.util.HashMap;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import com.ejie.ad74a.dao.ExpedientesDao;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.service.documentos.DocumentosService;
import com.ejie.ad74a.service.interoperabilidad.NisaeService;
import com.ejie.ad74a.util.constantes.TiposDocumentoRoleEnum;
import com.ejie.ad74a.ws.client.platea.expedienteElectronico.TDocument;
import com.ejie.ad74a.ws.client.platea.expedienteElectronico.TGetTelActionDocumentList;
import com.ejie.ad74a.ws.client.platea.expedienteElectronico.TTelActionDocument;

/**
 * Gestión del control de plazos
 * 
 * @author IBERMATICA
 */

@Service(value = "NisaeAsyncProcessService")
public class NisaeAsyncProcessServiceImpl implements NisaeAsyncProcessService {

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

	@Autowired
	private ExpedientesDao expedientesDao;

	@Autowired
	private NisaeService nisaeService;

	@Autowired
	private DocumentosService documentosService;

	@Autowired
	private Properties appConfiguration;

//	@Async("asyncExecutor")
//	@Override
//	public void consultInteroperabilityPlatea(Long codExpte) {
//		NisaeAsyncProcessServiceImpl.logger.info(
//				"NisaeAsyncProcessServiceImpl.consultInteroperabilityPlatea - Expediente " + codExpte + " - inicio");
//		try {
//			// ** Obtenemos la info del expediente ** //
//			Expedientes expediente = new Expedientes(codExpte);
//			expediente = this.expedientesDao.find(expediente);
//
//			TGetTelActionDocumentList folderDocuList = plateaService.getDocumentsTelAction(expediente.getFolderId00(),
//					expediente.getIdProcedimiento00());
//
//			this.invocarServicio(folderDocuList, TiposDocumentoRoleEnum.CONSULTA_DGP, codExpte);
//
//			this.invocarServicio(folderDocuList, TiposDocumentoRoleEnum.PADRON_DOMICILIARIO, codExpte);
//
//			this.invocarServicio(folderDocuList, TiposDocumentoRoleEnum.CERT_IRPF_RENTA, codExpte);
//
//		} catch (Exception e) {
//			NisaeAsyncProcessServiceImpl.logger
//					.error("NisaeAsyncProcessServiceImpl.consultInteroperabilityPlatea - Expediente " + codExpte
//							+ " ERROR: " + e.getMessage());
//			ManagerErrors.manageException(e, "Error consultando las interoperabilidades");
//
//		}
//		NisaeAsyncProcessServiceImpl.logger
//				.info("NisaeAsyncProcessServiceImpl.consultInteroperabilityPlatea - Expediente " + codExpte + " - fin");
//	}

	@Async("asyncExecutor")
	@Override
	public void consultInteroperabilityConyuge(Long codExpte) {
		NisaeAsyncProcessServiceImpl.logger.info(
				"NisaeAsyncProcessServiceImpl.consultInteroperabilityConyuge - Expediente " + codExpte + " - inicio");
		try {
			// Para dar tiempo a que se procese el expediente por completo
			TimeUnit.SECONDS.sleep(10);
			// ** Obtenemos la info del expediente ** //
			Expedientes expediente = new Expedientes(codExpte);
			expediente = this.expedientesDao.find(expediente);

			this.nisaeService.consultaConyugeIrpf(expediente);

		} catch (Exception e) {
			NisaeAsyncProcessServiceImpl.logger
					.error("NisaeAsyncProcessServiceImpl.consultInteroperabilityConyuge - Expediente " + codExpte
							+ " ERROR: " + e.getMessage());
			ManagerErrors.manageException(e, "Error consultando las interoperabilidades del conyuge");

		}
		NisaeAsyncProcessServiceImpl.logger.info(
				"NisaeAsyncProcessServiceImpl.consultInteroperabilityConyuge - Expediente " + codExpte + " - fin");
	}

	@Async("asyncExecutor")
	@Override
	public void consultInteroperabilityDiscapacidad(Long codExpte) {
		NisaeAsyncProcessServiceImpl.logger
				.info("NisaeAsyncProcessServiceImpl.consultInteroperabilityDiscapacidad - Expediente " + codExpte
						+ " - inicio");
		try {
			// Para dar tiempo a que se procese el expediente por completo
			TimeUnit.SECONDS.sleep(10);
			// ** Obtenemos la info del expediente ** //
			Expedientes expediente = new Expedientes(codExpte);
			expediente = this.expedientesDao.find(expediente);

			this.nisaeService.consultaDiscapacidad(expediente);

		} catch (Exception e) {
			NisaeAsyncProcessServiceImpl.logger
					.error("NisaeAsyncProcessServiceImpl.consultInteroperabilityDiscapacidad - Expediente " + codExpte
							+ " ERROR: " + e.getMessage());
			ManagerErrors.manageException(e, "Error consultando las interoperabilidades de dicapacidad");

		}
		NisaeAsyncProcessServiceImpl.logger.info(
				"NisaeAsyncProcessServiceImpl.consultInteroperabilityDiscapacidad - Expediente " + codExpte + " - fin");
	}

	@Async("asyncExecutor")
	@Override
	public void authorizationResultConsolidationAsync(String folderID, String procedureID) {
		NisaeAsyncProcessServiceImpl.logger
				.info("NisaeAsyncProcessServiceImpl.authorizationResultConsolidationAsync - Inicio folderID: "
						+ folderID + " - procedureID: " + procedureID);
		try {
			TimeUnit.SECONDS.sleep(10);
			String nif = this.appConfiguration.getProperty("gv.cif");
			Expedientes exp = new Expedientes();
			exp.setFolderId00(folderID);
			exp = this.expedientesDao.findAll(exp, null).get(0);
			this.documentosService.authorizationResultConsolidation(exp, procedureID, nif);
		} catch (Exception e) {
			NisaeAsyncProcessServiceImpl.logger
					.error("NisaeAsyncProcessServiceImpl.consultInteroperabilityPlatea - folderID " + folderID
							+ " ERROR: " + e.getMessage());
		}
		NisaeAsyncProcessServiceImpl.logger
				.info("NisaeAsyncProcessServiceImpl.consultInteroperabilityPlatea - folderID " + folderID + " - fin");
	}

//	/**
//	 * 
//	 * @param folderDocuList
//	 * @param tipoServicio
//	 * @param codExpte
//	 */
//	private void invocarServicio(TGetTelActionDocumentList folderDocuList, TiposDocumentoRoleEnum tipoServicio,
//			Long codExpte) {
//		HashMap<String, String> datosServicio = new HashMap<String, String>();
//		try {
//			datosServicio = this.datosServicio(folderDocuList, tipoServicio);
//			NisaeAsyncProcessServiceImpl.logger.info(
//					"InterOPAsyncProcessServiceImpl.reInvocarServInterOP - Invocación ServInterOP Agencia Tributaria "
//							+ codExpte + "-" + datosServicio.get("authorizationID") + "- fin");
//			this.documentosService.authorizationCall(datosServicio.get("authorizationID"),
//					datosServicio.get("proceedingID"), codExpte);
//		} catch (Throwable e) {
//			NisaeAsyncProcessServiceImpl.logger.info(
//					"InterOPAsyncProcessServiceImpl.reInvocarServInterOP - ERROR Invocación ServInterOP Agencia Tributaria "
//							+ codExpte + "-" + datosServicio.get("authorizationID") + "- fin");
//		}
//	}

	/**
	 * Recupera el authorizationId del servicio de interOP
	 * 
	 * @param folderDocuList lista de autorizaciones
	 * @param tipoServicio   Tipo de servicio
	 * @return authorizationID
	 */
	private HashMap<String, String> datosServicio(TGetTelActionDocumentList folderDocuList,
			TiposDocumentoRoleEnum tipoServicio) {

		HashMap<String, String> datosServicio = new HashMap<String, String>();

		if (null != folderDocuList && null != folderDocuList.getTelActionList()
				&& null != folderDocuList.getTelActionList().getTelAction()) {
			for (TTelActionDocument folderAutho : folderDocuList.getTelActionList().getTelAction()) {

				if (null != folderAutho.getAuthorizationList()
						&& null != folderAutho.getAuthorizationList().getDocument()) {
					for (TDocument document : folderAutho.getAuthorizationList().getDocument()) {

						if (tipoServicio.getRoleID().equals(document.getDocumentRoleID())
								&& document.getAuthorization() != null) {

							datosServicio.put("authorizationID", document.getAuthorization().getAuthorizationID());
							datosServicio.put("proceedingID", folderAutho.getApplicationID());
						}
					}
				}
			}
		}

		return datosServicio;
	}

}
