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

import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.CheckEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Messagebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.SapService;
import com.rjconsultores.ventaboletos.vo.integracao.FechamentoCntCorrenteVO;
import com.rjconsultores.ventaboletos.web.gui.controladores.job.IntegracaoSapJob;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderFechamentoCntcorrente;

@Controller("relatorioSapController")
@Scope("prototype")
public class RelatorioSapController extends MyGenericForwardComposer {

	private static final String TITULO = "relatorioSap.window.title";
	private static final long serialVersionUID = -6110350409404675022L;
	private static Logger log = LogManager.getLogger(RelatorioSapController.class);

	private MyListbox boletoFechamentoList;
	
	private List<Empresa> lsEmpresas;
	private List<FechamentoCntCorrenteVO> lsFechamentoCntcorrente;	
	private Empresa empresa;
	private PuntoVenta puntoVenta;
	private int qtdEnviar = 0;
	private String status;
	
	private Combobox cmbEmpresa;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private Datebox fecBoletoIni;
	private Datebox fecBoletoFin;
	
	private Checkbox chkIntegrado;
	private Checkbox chkNaoEnviado;
	private Checkbox chkPendente;
	private Checkbox chkRecusado;
	
	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private SapService sapService;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		this.lsEmpresas = empresaService.obtenerTodos();

        super.doAfterCompose(comp);
        
        for (Empresa e : this.lsEmpresas) {
			Comboitem comboItem = new Comboitem(e.getNombempresa());
			comboItem.setValue(e);
			comboItem.setParent(this.cmbEmpresa);
		}
        
        this.boletoFechamentoList.setItemRenderer(new RenderFechamentoCntcorrente(new EventListener() {

			@Override
			public void onEvent(Event arg0) throws Exception {

				FechamentoCntCorrenteVO registro = (FechamentoCntCorrenteVO) arg0.getTarget().getAttribute("data");
				for (Object obj : boletoFechamentoList.getListData()) {
					FechamentoCntCorrenteVO fechamento = (FechamentoCntCorrenteVO) obj;
					if (fechamento.equals(registro)) {
						fechamento.setEnviar( ((CheckEvent)arg0).isChecked() );
						
						if( ((CheckEvent)arg0).isChecked() ) {
							qtdEnviar++;
						}else {
							qtdEnviar--;
						}
						
						break;
					}
				}
			}
		}));        
        
        this.chkIntegrado.setChecked(Boolean.FALSE);
        this.chkNaoEnviado.setChecked(Boolean.FALSE);
        this.chkPendente.setChecked(Boolean.FALSE);
        this.chkRecusado.setChecked(Boolean.FALSE);
        
	}
	
	public void onClick$btnPesquisar(Event ev) throws Exception {
		
		if(cmbEmpresa.getSelectedItem() == null){
			Messagebox.show(Labels.getLabel("relatorioSapController.MGS.erroSemEmpresa"), 
					Labels.getLabel(TITULO), 
					Messagebox.CANCEL, 
					Messagebox.ERROR);
			return;
		}
		
		empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		
		if( cmbPuntoVenta.getSelectedItem() != null ) {
			puntoVenta = (PuntoVenta) cmbPuntoVenta.getSelectedItem().getValue();
		}
		
		status = "";
		status += chkIntegrado.isChecked()?"0,":"";
		status += chkNaoEnviado.isChecked()?"1,":"";
		status += chkPendente.isChecked()?"2,":"";
		status += chkRecusado.isChecked()?"3,":"";
		
		if(status.endsWith(",")) {
			status = status.substring(0, status.length()-1);
		}

		this.lsFechamentoCntcorrente = sapService.obtenerTodosParaRemessa(empresa, this.fecBoletoIni.getValue(), this.fecBoletoFin.getValue(), status,  puntoVenta);
		this.boletoFechamentoList.setData(this.lsFechamentoCntcorrente);
		
		if(this.lsFechamentoCntcorrente.isEmpty()){
			Messagebox.show(Labels.getLabel("relatorioSapController.MGS.alertaCNABSemItens"), 
					Labels.getLabel(TITULO), Messagebox.CANCEL, Messagebox.ERROR);
		}
	}
	
	public void onClick$btnExecutarRemessa(Event ev) throws Exception {
		
		if(this.lsFechamentoCntcorrente.isEmpty()){
			return;
		}
		try {
			int integrados = sapService.remessa( lsFechamentoCntcorrente, true );
			
			if( integrados == 0 ){
				
				Messagebox.show(Labels.getLabel("relatorioSapController.MGS.erroNaoIntegrado"), 
								Labels.getLabel(TITULO), Messagebox.OK, Messagebox.ERROR);
			}else if( integrados < qtdEnviar ) {
				Messagebox.show(Labels.getLabel("relatorioSapController.MGS.erroIntegradoParcial"), 
						Labels.getLabel(TITULO), Messagebox.OK, Messagebox.ERROR);
			}else if( integrados == qtdEnviar ) {
				Messagebox.show(Labels.getLabel("relatorioSapController.MGS.erroIntegrado"),
						Labels.getLabel(TITULO), Messagebox.OK, Messagebox.ERROR);
			}
		} catch (Exception e) {
			Messagebox.show( e.getMessage(), 
					Labels.getLabel(TITULO), Messagebox.OK, Messagebox.ERROR);
		}
	}
	
	public void onClick$btnReintegrar(Event ev) throws Exception {
		
		try {
			Scheduler sched = new StdSchedulerFactory().getScheduler();
			JobDetail jobDetail = new JobDetail("IntegracaoSap", null, IntegracaoSapJob.class);
			log.info(Labels.getLabel("relatorioSapController.MGS.erroIntegraManual"));
			Trigger trigger = TriggerUtils.makeImmediateTrigger("integracaoSapTrigger", 1, 1000);
			trigger.setName("integracaoSapTrigger");
			JobDetail job = sched.getJobDetail(jobDetail.getName(), jobDetail.getGroup());
			log.info("Job=" + jobDetail.getName() + "." + jobDetail.getGroup());

			if (job != null) {
				log.info("Job ya existia");
				boolean deleted = sched.deleteJob(job.getName(), Scheduler.DEFAULT_GROUP);
				log.info("Deleted=" + deleted);
			}

			sched.scheduleJob(jobDetail, trigger);

			sched.start();						
			
			Messagebox.show(Labels.getLabel("relatorioSapController.MGS.rotinaIniciada"), 
						Labels.getLabel(TITULO), Messagebox.OK, Messagebox.INFORMATION);			

		} catch (SchedulerException ex) {
			log.error(ex);			
		} catch (RuntimeException e) {
			Messagebox.show( e.getMessage(), 
					Labels.getLabel(TITULO), Messagebox.OK, Messagebox.ERROR);
		}
	}
	
	public Empresa getEmpresa() {
		return empresa;
	}
	
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
}