/**
 * 
 */
package com.ejie.ad74a.process;

import java.util.Arrays;
import java.util.Calendar;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.ejie.ad74a.exception.BatchProcessException;
import com.ejie.ad74a.model.Procesos;
import com.ejie.ad74a.service.CopagoAytoService;
import com.ejie.ad74a.service.DepDisMasivaService;
import com.ejie.ad74a.service.ProcesosService;
import com.ejie.ad74a.util.UtilDates;
import com.ejie.ad74a.util.constantes.ConstantesBatch;
import com.ejie.ad74a.util.constantes.EstadosProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.ProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.TipoInteroperabilidadadEnum;

/**
 * Proceso para la llamada masiva de dependencia y discapacidad.
 *  
 * @author IHERNANG
 *
 */
@Component(value = "depDisMasiva")
public class DepDisMasivaProcess implements IProcess {

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

	@Autowired
	CopagoAytoService copAytoService;
	
	@Autowired
	ProcesosService procesosService;
	
	@Autowired
	DepDisMasivaService depDisMasivaService;

	/**
	 * Metodo de ejecucion del proceso.
	 * 
	 * @param arg[0] : tipo interoperabilidad
	 * @param arg[1] : provincia
	 * @param arg[2] : idProceso tabla AD74A98T00
	 * 
	 * Formato del parámetro: @@idProceso@@
	 */
	@Override
	public void execute(String... args) throws BatchProcessException {

		// Comprobacion si el proceso debe ejecutarse en MODO PRUEBA
		final boolean modoPrueba = Arrays.asList(args).stream().anyMatch(ConstantesBatch.ARGUMENTO_MODO_PRUEBA::equalsIgnoreCase);
		
		// Quitar argumento "modoPrueba" si estaba entre la lista original de argumentos
		String[] argsWithoutModoPrueba = Arrays.asList(args).stream()
				.filter(((Predicate<String>) ConstantesBatch.ARGUMENTO_MODO_PRUEBA::equalsIgnoreCase).negate())
				.toArray(String[]::new);
		
		
		Procesos proceso = new Procesos();		
		try {
			String params = Arrays.asList(argsWithoutModoPrueba).stream().map(i -> i).collect(Collectors.joining(", "));
			
			logger.debug("Params: {}", params);
			
			
			String tipoInterop = argsWithoutModoPrueba.length >= 2 ? argsWithoutModoPrueba[0] : null;
			String prov = argsWithoutModoPrueba.length >= 2 ? argsWithoutModoPrueba[1] : null;
			String idProceso = argsWithoutModoPrueba.length == 3 ? argsWithoutModoPrueba[2] : null;
			logger.debug("Params: tipoInterop {},prov {},idProceso {} ", tipoInterop,prov,idProceso);

			TipoInteroperabilidadadEnum tipo = TipoInteroperabilidadadEnum.getById(tipoInterop);
			if(tipo != null) {				
				// Buscar si existe el proceso en bbdd
				boolean addProceso = false;
				if(idProceso == null || "".equals(idProceso)) {
					addProceso = true;
				} else {
					proceso = new Procesos(Long.valueOf(idProceso));
					proceso = this.procesosService.find(proceso);
					addProceso = null == proceso? true: false;					
				}	
				
				if(addProceso) {
					Calendar calendar = Calendar.getInstance();
					calendar.setTime(UtilDates.getFechaSistema());
					// Creamos un proceso nuevo
					// 1- Insertar el nuevo proceso en la tabla AD74A98T00
					proceso = new Procesos();
					proceso.setEstado98(EstadosProcesosBatchEnum.PENDIENTE.getId());
					proceso.setUsuAlta98("AD74A");				
					proceso.setTipoProceso98(ProcesosBatchEnum.DEP_DIS_MASIVA.getId());
					proceso.setProceso98("dep_dis_" + tipoInterop + "_" + prov);
					proceso = this.procesosService.add(proceso);
				}
				
				this.procesosService.actualizarAIniciado(proceso);
				
				//se llama al service correspondiente para lanzar las interoperabilidades			
				//se obtiene los solicitantes, se crean los ficheros csv en lotes de 4000 solicitantes y se suben al pif				
				depDisMasivaService.lanzarInterNISSAE(tipoInterop, prov, idProceso,modoPrueba);
				
				this.procesosService.actualizarAFinalizado(proceso);	
			}else {
				logger.error("No se ha especificado la interoperabilidad a ejecutar. No se hace nada");
			}
			
		} catch (Exception e) {
			if(proceso != null && proceso.getIdProceso98() != null) {				
				proceso.setError98(e.getMessage().substring(0, Math.min(e.getMessage().length(), 799))); // Máximo 800
				this.procesosService.actualizarAError(proceso);
			}
			throw new BatchProcessException(e);
		}

	}
}