package com.rjconsultores.ventaboletos.web.gui.controladores.job;

import java.util.Calendar;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

import com.rjconsultores.ventaboletos.entidad.MonitoramentoCRZ;
import com.rjconsultores.ventaboletos.service.MonitoramentoCCFService;
import com.rjconsultores.ventaboletos.service.MonitoramentoCRZService;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;

public class MonitoramentoCCFCRZJob implements Job {
	private static Logger log = LogManager.getLogger(MonitoramentoCCFCRZJob.class);

	private Calendar inicio;
	
	@Autowired
	private MonitoramentoCCFService monitoramentoCCFService;
	@Autowired 
	private MonitoramentoCRZService monitoramentoCRZService;
	
	
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		log.info("Inicio do job de Monitoramento CCF CRZ...");
		ApplicationContext appContext = AppContext.getApplicationContext();
		monitoramentoCCFService = (MonitoramentoCCFService) appContext.getBean("monitoramentoCCFService");
		monitoramentoCRZService = (MonitoramentoCRZService) appContext.getBean("monitoramentoCRZService");
		
		inicio = Calendar.getInstance();
		inicio.add(Calendar.DATE, -1);
		inicio.set(Calendar.HOUR, 0);
		inicio.set(Calendar.MINUTE, 0);
		inicio.set(Calendar.SECOND, 0);
		
		gravaCCFsQuebrados();
		
		gravaCRZsQuebradas();
	    
		log.info("Fim do job de Monitoramento CCF CRZ.");
	}

	private void gravaCRZsQuebradas() {
		log.info("Gravando CRZs quebradas...");
	    for (MonitoramentoCRZ m : buscaQuebraCRZ()){
	    	monitoramentoCRZService.suscribir(m);
	    }
	}

	private void gravaCCFsQuebrados() {
		try{
			//con = dataSource.getConnection();
			monitoramentoCCFService.openConnection();
			/*
			 * CCF:
			 * Distinct serie impressora na caja pra pegar somente as que venderam no dia anterior
			 * ultimo CCF no dia anterior -1 pra pegar o inicial
			 * join caja com fiscal_r4		 
			 * verificar se tem quebra
			 */
			log.info("Gravando CCFs quebrados...");
			Map<String, Integer> impressoras = monitoramentoCCFService.obterImpressorasComCCFInicial(inicio.getTime());
			Calendar c = Calendar.getInstance();
			c.setTime(inicio.getTime());
			c.add(Calendar.DAY_OF_MONTH, -5);
			monitoramentoCCFService.gravarListaCCFQuebrados(impressoras, c.getTime());	  
			//con.commit();
			monitoramentoCCFService.closeConnection();
		} catch (Exception e){
			log.error("", e);
		} 
	}
	
	public List<MonitoramentoCRZ> buscaQuebraCRZ(){
		return monitoramentoCRZService.buscaQuebraCRZ(inicio.getTime());
	}
}
