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

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

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.zhtml.Filedownload;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.ArquivoRemessa;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FechamentoBoleto;
import com.rjconsultores.ventaboletos.layouts.CNABFactory;
import com.rjconsultores.ventaboletos.layouts.RemessaInterface;
import com.rjconsultores.ventaboletos.service.ArquivoRemessaCNAB;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderFechamentoBoleto;

@Controller("relatorioArquivoRemessaCNABController")
@Scope("prototype")
public class RelatorioArquivoRemessaCNABController extends MyGenericForwardComposer {

	private static final long serialVersionUID = -6110350409404675022L;

	private MyListbox boletoFechamentoList;
	
	private List<Empresa> lsEmpresas;
	private List<FechamentoBoleto> lsFechamentoBoletos;
	private Empresa empresa;
	private Boolean reenviar;
	
	private Combobox cmbEmpresa;
	private Datebox fecBoletoIni;
	private Datebox fecBoletoFin;
	private Checkbox chkReenviarGerados;
	
	@Autowired
	private ArquivoRemessaCNAB arquivoRemessaCNAB;
	
	@Override
    public void doAfterCompose(Component comp) throws Exception {
		
		this.lsEmpresas = this.arquivoRemessaCNAB.getEmpresas();

        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 RenderFechamentoBoleto());
        this.chkReenviarGerados.setChecked(Boolean.FALSE);
	}
	
	public void onClick$btnPesquisar(Event ev) throws Exception {
		
		if(cmbEmpresa.getSelectedItem() == null){
			Messagebox.show(Labels.getLabel("relatorioRemessaCNAB.MGS.erroSemEmpresa"), Labels.getLabel("relatorioRemessaCNAB.window.title"), Messagebox.CANCEL, Messagebox.ERROR);
			return;
		}
		
		empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();

		this.lsFechamentoBoletos = arquivoRemessaCNAB.obtenerTodosParaRemessa(empresa, this.fecBoletoIni.getValue(), this.fecBoletoFin.getValue(), chkReenviarGerados.isChecked());
		this.boletoFechamentoList.setData(this.lsFechamentoBoletos);
		
		valida();
	}
	
	public void onClick$btnExecutarRemessa(Event ev) throws Exception {
		
		if(!valida()){
			return;
		}
		
		empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		
		if(empresa == null){
			Messagebox.show(Labels.getLabel("relatorioRemessaCNAB.MGS.erroSemEmpresa"), Labels.getLabel("relatorioRemessaCNAB.window.title"), Messagebox.CANCEL, Messagebox.ERROR);
			return;
		}
		
		ArquivoRemessa arquivoRemessa = arquivoRemessaCNAB.remessa(empresa, fecBoletoIni.getValue(), fecBoletoFin.getValue(), chkReenviarGerados.isChecked());
		
		if( arquivoRemessa ==null || arquivoRemessa.getItens() == null ){
				Messagebox.show(Labels.getLabel("relatorioRemessaCNAB.MGS.alertaArquivoRemessaNaoGerado"), 
						Labels.getLabel("relatorioRemessaCNAB.window.title"), Messagebox.OK, Messagebox.ERROR);
			return;
		}
		
		RemessaInterface remessaInterface = CNABFactory.createRemessa(arquivoRemessa.getBancoLayout());
		
		File fileRemessa = File.createTempFile("cnab", "remessa");
		
		remessaInterface.gerarRemessa(fileRemessa, arquivoRemessa);
		
		InputStream is = null;
        is = new FileInputStream(fileRemessa);
        Filedownload.save(is, "application/txt", arquivoRemessa.getNomeArquivo());
        
        arquivoRemessaCNAB.atualizaRemessa(empresa, arquivoRemessa);
	}
	
	public void onClick$btnImportarRetornoRemessa(Event ev) throws Exception {
		
	}	
	
	public Empresa getEmpresa() {
		return empresa;
	}
	
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	
	public Boolean getReenviar() {
		return reenviar;
	}
	
	public void setReenviar(Boolean reenviar) {
		this.reenviar = reenviar;
	}
	
	private boolean valida() throws Exception{
		
		if(!arquivoRemessaCNAB.temPermissao()){
			Messagebox.show(Labels.getLabel("relatorioRemessaCNAB.MGS.alertaConstanteCNABnaoconfigurada"), 
					Labels.getLabel("relatorioRemessaCNAB.window.title"), Messagebox.CANCEL, Messagebox.ERROR);
			return Boolean.FALSE;
		}
		
		if(!arquivoRemessaCNAB.boletosOk(lsFechamentoBoletos)){
			Messagebox.show(Labels.getLabel("relatorioRemessaCNAB.MGS.alertaConstanteCNABNossoNumeroForaPardrao"), 
					Labels.getLabel("relatorioRemessaCNAB.window.title"), Messagebox.CANCEL, Messagebox.ERROR);
		}
		
		if(!arquivoRemessaCNAB.boletosAEnviar(lsFechamentoBoletos)){
			if(!chkReenviarGerados.isChecked()){
				Messagebox.show(Labels.getLabel("relatorioRemessaCNAB.MGS.alertaCNABSemItens"), 
						Labels.getLabel("relatorioRemessaCNAB.window.title"), Messagebox.CANCEL, Messagebox.ERROR);
				return Boolean.FALSE;
			}
		}
		
		return Boolean.TRUE;
	}
}
