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

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Date;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

import javax.activation.MimetypesFileTypeMap;
import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Textbox;

import com.rjconsultores.integracaoreceitadespesa.BGMApplication;
import com.rjconsultores.integracaoreceitadespesa.IntegracaoReceitaDespesaException;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.LogDespesaReceitaDiversa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.LogDespesasReceitasDivService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEmpresa;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("relatorioReceitasDespesasDivController")
@Scope("prototype")
public class RelatorioArquivoReceitasDespesasDivController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(RelatorioArquivoReceitasDespesasDivController.class);
	
	private MyComboboxEmpresa cmbEmpresa;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private Datebox datInicial;
	private Datebox datFinal;
	private Textbox txtArquivo;

	@Autowired
	private ConstanteService constanteService;
	
	@Autowired
	private LogDespesasReceitasDivService logDespesasReceitasDivService;
	
	@Autowired
	private DataSource dataSource;
	

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		String pathExternoGravacaoArquivo = this.getPathExternoGravacaoArquivo();
		
		if (StringUtils.isNotBlank(pathExternoGravacaoArquivo)){
			txtArquivo.setText(pathExternoGravacaoArquivo);	
		}
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		
		datInicial.getValue();
		datFinal.getValue();
		cmbEmpresa.getValue();
		cmbPuntoVenta.getValue();
		txtArquivo.getValue();
		
		int resp = Messagebox.show(
				Labels.getLabel("relatorioReceitasDespesasDivController.msg.confirma"),
				Labels.getLabel("relatorioReceitasDespesasDivController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {
			if (cmbPuntoVenta.getSelectedItem() == null){
				Messagebox.show(Labels.getLabel("relatorioReceitasDespesasDivController.msg.erro.puntoventa"),
						Labels.getLabel("relatorioReceitasDespesasDivController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			if (cmbEmpresa.getSelectedItem() == null){
				Messagebox.show(Labels.getLabel("relatorioReceitasDespesasDivController.msg.erro.empresa"),
						Labels.getLabel("relatorioReceitasDespesasDivController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			executarRelatorio();
		}

	}

	/**
	 * @throws Exception
	 * 
	 */
	private void executarRelatorio() throws Exception {	 		
		Integer puntoVentaId = ((PuntoVenta)cmbPuntoVenta.getSelectedItem().getValue()).getPuntoventaId();
		Integer empresaId = ((Empresa)cmbEmpresa.getSelectedItem().getValue()).getEmpresaId();
		Connection con = dataSource.getConnection();
		String fileZip = "";
		try{
			
			
			fileZip = BGMApplication.getInstance().executaExportacao(
					datInicial.getValue(), 
					datFinal.getValue(), 
					System.getProperty("jboss.server.log.dir"), 
					empresaId, 
					puntoVentaId, 
					con, 
					this.getPathExternoGravacaoArquivo(),
					ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.IS_INCLUI_TIPO_PAGAMENTO_TURISMO_BGM.getDescricao()), 
					ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.IS_RECEITA_DESPESAS_COMPORTE.getDescricao()),
					ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.IS_RECEITA_DESPESAS_OURO_PRATA.getDescricao()));
			
			long size = 0;
			ZipFile compactado = new ZipFile(new File(fileZip));

			Enumeration<? extends ZipEntry> entries = compactado.entries();
			while (entries.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) entries.nextElement();
				size = size + entry.getSize();

			}
			compactado.close();

			if (size == 0) {
				Messagebox.show(Labels.getLabel("relatorioReceitasDespesasDivController.msg.erro.empresa"),
						Labels.getLabel("relatorioReceitasDespesasDivController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			LogDespesaReceitaDiversa logDespRec = new LogDespesaReceitaDiversa();
			logDespRec.setDataExecucao(new Date());
			logDespRec.setDataInicio(datInicial.getValue());
			logDespRec.setDataFim(datFinal.getValue());
			logDespRec.setEmpresa((Empresa)cmbEmpresa.getSelectedItem().getValue());
			logDespRec.setIndProcessado(true);
			logDespRec.setUsuario(UsuarioLogado.getUsuarioLogado());
			logDespesasReceitasDivService.suscribir(logDespRec);
			
		} catch (IntegracaoReceitaDespesaException e){
			LogDespesaReceitaDiversa logDespRec = new LogDespesaReceitaDiversa();
			logDespRec.setDataExecucao(new Date());
			logDespRec.setDataInicio(datInicial.getValue());
			logDespRec.setDataFim(datFinal.getValue());
			logDespRec.setEmpresa((Empresa)cmbEmpresa.getSelectedItem().getValue());
			logDespRec.setIndProcessado(false);
			logDespRec.setUsuario(UsuarioLogado.getUsuarioLogado());
			logDespesasReceitasDivService.suscribir(logDespRec);
			
			Messagebox.show(e.getMessage(),
					Labels.getLabel("relatorioReceitasDespesasDivController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
		
		if(this.getPathExternoGravacaoArquivo() != null){
			Messagebox.show(Labels.getLabel("relatorioReceitasDespesasDivController.arquivoGeradoNoServidor.value"),
					Labels.getLabel("relatorioReceitasDespesasDivController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}else{
			try{
				FileInputStream inputStream;
				File filez = new File(fileZip);
				log.info(filez.exists());
		        if (filez.exists()) {
		        	log.debug("download dos arquivos");
		            inputStream = new FileInputStream(filez);
		            Filedownload.save(inputStream, new MimetypesFileTypeMap().getContentType(filez), filez.getName());
		        }
		        filez.delete(); 
		        
			} finally {
	        	con.close();
	        }
		}
	}

	private String getPathExternoGravacaoArquivo(){
		Constante path = constanteService.buscarPorNomeConstante("LOCALIZACAO_ARQUIVO_BGM");
		if (path == null){
			return null;
		}
		
		return path.getValorconstante();
	}
	
	public MyComboboxEmpresa getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(MyComboboxEmpresa cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public MyComboboxPuntoVenta getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

	public void setCmbPuntoVenta(MyComboboxPuntoVenta cmbPuntoVenta) {
		this.cmbPuntoVenta = cmbPuntoVenta;
	}

	public Datebox getDatInicial() {
		return datInicial;
	}

	public void setDatInicial(Datebox datInicial) {
		this.datInicial = datInicial;
	}

	public Datebox getDatFinal() {
		return datFinal;
	}

	public void setDatFinal(Datebox datFinal) {
		this.datFinal = datFinal;
	}
	

}
