package com.ejie.ab39a.procesos;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.DefaultTransactionStatus;

import com.ejie.ab39a.service.PlanEstrategicoService;
import com.ejie.ab39a.util.Constantes;
import com.ejie.ab39a.util.PropertiesUtil;

@Service("procesoAmaiera") 
public class ProcesoAmaiera {
	
	private static final Logger logger = LoggerFactory
			.getLogger(ProcesoAmaiera.class);

	private DataSourceTransactionManager manager;
	
	@Autowired
	private PlanEstrategicoService planEstrategicoService;
	
	/**
	 * 
	 * @param manager
	 */
	public void setManager(DataSourceTransactionManager manager) {
		this.manager = manager;
	}
	
	
	/**
	 * 
	 * @param factory BeanFactory
	 * @throws Exception e
	 */
	public void ejecutarProcesoAmaiera(BeanFactory factory) throws Exception{
		
		ProcesoAmaiera.logger.debug("Entrando");
		// Se crea una nueva transaccion para poder controlar el rollback
		DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
		defaultTransactionDefinition.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW);
		ProcesoAmaiera.logger.debug("defaultTransactionDefinition.toString()");
		ProcesoAmaiera.logger.debug(defaultTransactionDefinition.toString());
		DefaultTransactionStatus defaultTransactionStatus =  (DefaultTransactionStatus) this.manager.getTransaction(defaultTransactionDefinition);
		ProcesoAmaiera.logger.debug("defaultTransactionStatus.toString()");
		ProcesoAmaiera.logger.debug(defaultTransactionStatus.toString());
				
		try{
			ProcesoAmaiera.logger.debug("EjecutarProceso: antes de");
			//Long cuenta = this.planEstrategicoService.getPlanesEstrategicosCount();
			
			Integer mesesAntes = new Integer(PropertiesUtil.getProperty(Constantes.MESESANTES));
			this.planEstrategicoService.enviarCorreos(mesesAntes);
			
			//ProcesoAmaiera.logger.debug("EjecutarProceso: despues:".concat(String.valueOf(cuenta)));
			ProcesoAmaiera.logger.debug("EjecutarProceso FIN");
			
		}catch (Exception e){
			ProcesoAmaiera.logger.debug("ERROR:".concat(e.getMessage()));
			ProcesoAmaiera.logger.error("ERROR:",e);
		} finally {					 
			this.manager.commit(defaultTransactionStatus);
		}	

		ProcesoAmaiera.logger.debug("Saliendo");
	}
}
