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

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
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.ProcesosService;
import com.ejie.ad74a.service.SeguimientoUsuariosService;
import com.ejie.ad74a.service.impl.DepDisMasivaServiceImpl;
import com.ejie.ad74a.util.UtilDates;
import com.ejie.ad74a.util.constantes.EstadosProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.ProcesosBatchEnum;

/**
 * Proceso para la generacion del ficheros de intercambio con Diputaciones.
 *  
 * @author IHERNANG
 *
 */
@Component(value = "segUsu")
public class SeguimientoUsuariosProcess implements IProcess {

	private static final Logger logger = LoggerFactory.getLogger(SeguimientoUsuariosProcess.class);
	
	@Autowired
	ProcesosService procesosService;
	
	@Autowired
	SeguimientoUsuariosService seguimientoUsuariosService;

	/**
	 * Metodo de ejecucion del proceso.
	 * 
	 * @param arg[0] : idProceso tabla AD74A98T00 (opcional)
	 * 
	 * Formato del parï¿½metro: @@provincia@@idProceso@@
	 */
	@Override
	public void execute(String... args) throws BatchProcessException {

		
		Procesos proceso = new Procesos();		
		try {
			String params = Arrays.asList(args).stream().map(i -> i).collect(Collectors.joining(", "));
			
			logger.debug("Params: {}", params);
			
			
			String idProceso = null; // No vendrá como parámetro ya que no se va a ejecutar desde el front
			String fInicio = args.length >= 1 ? args[0] : null;
			String fFin = args.length == 2 ? args[1] : 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.SEG_USUARIOS.getId());
				proceso.setProceso98(calendar.get(Calendar.YEAR) 
						+ "" + String.format("%02d" , (calendar.get(Calendar.MONTH) + 1)) 
						+ "" + String.format("%02d" , calendar.get(Calendar.DAY_OF_MONTH)));
				proceso = this.procesosService.add(proceso);
			}
			
			this.procesosService.actualizarAIniciado(proceso);		
			// Intentar convertir las fechas
			SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
			Date fInicioD = Calendar.getInstance().getTime();
			// Si la hora es entre las 00:00 y las 07:00 coge el día anterior (si no viene una fecha de inicio como parámetro)
			Calendar ahora = Calendar.getInstance();
			int hora = ahora.get(Calendar.HOUR_OF_DAY);
			if(hora >= 0 && hora <= 7) {
				ahora.add(Calendar.DAY_OF_MONTH, -1);
				fInicioD = ahora.getTime();				
			}
			
			Calendar calendario = Calendar.getInstance();
			calendario.add(Calendar.DAY_OF_MONTH, 1);
			Date fFinD = calendario.getTime();
			if(fInicio != null) {					
				fInicioD = formatter.parse(fInicio);
			}			
			if(fFin != null) {					
				fFinD = formatter.parse(fFin);
			}
			
			SeguimientoUsuariosProcess.logger.info("SeguimientoUsuariosProcess fInicio: "+ formatter.format(fInicioD) + "; fFin: " + formatter.format(fFinD));
			this.seguimientoUsuariosService.generarSeguimientoUsuarios(fInicioD, fFinD);			
			this.procesosService.actualizarAFinalizado(proceso);				
			
		} 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);
		}

	}

}
