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

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
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.media.Media;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Filedownload;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zul.Messagebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.ImportacaoRetornoBancarioService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("importarRetornoBancarioController")
@Scope("prototype")
public class ImportarRetornoBancarioController extends MyGenericForwardComposer {

	private static final String TITULO = "importarRetornoBancarioController.window.title";
	private static final long serialVersionUID = 1L;
	@Autowired
	private ImportacaoRetornoBancarioService importacaoRetornoBancarioService;
	
	@Autowired
	private EmpresaService empresaService;
	
	private List<Empresa> lsEmpresa;
	private MyComboboxEstandar cmbEmpresa;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		lsEmpresa = new ArrayList<>();		
		lsEmpresa.addAll(empresaService.obtenerTodos());
	}

	public void onUpload(UploadEvent event) throws IOException, InterruptedException {
		final String resultado;
		
		if (cmbEmpresa.getSelectedItem() == null){
			Messagebox.show(Labels.getLabel("relatorioRetornoBancario.MSG.erroSemEmpresa"),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
				
		Media media = event.getMedia();
		if(media.getName().toLowerCase().endsWith(".ret")){
			
			Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();				        
			resultado = importacaoRetornoBancarioService.lerArquivo(converterByteArrayInputStream(media.getStreamData()), empresa);
		}else{
			Messagebox.show(Labels.getLabel("relatorioRetornoBancario.MSG.extensaoInvalida"),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		if (resultado.startsWith("Arquivo Processado com sucesso")) {
			Messagebox.show("Arquivo Processado com sucesso",
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.INFORMATION);
		}else if (resultado.startsWith("Arquivo Processado com ressalvas")) {
				Messagebox.show("Arquivo Processado com ressalvas",
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			Messagebox.show(resultado,
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.ERROR);
		}
		
		Messagebox.show("Deseja baixar arquivo com detalhes do processamento?", 
				Labels.getLabel(TITULO),
				Messagebox.OK | Messagebox.CANCEL,
				Messagebox.QUESTION,
				 	new org.zkoss.zk.ui.event.EventListener(){
				 		public void onEvent(Event e){
				 			if(Messagebox.ON_OK.equals(e.getName())){
				 				InputStream is = new ByteArrayInputStream(resultado.getBytes());
				 				Filedownload.save(is, "application/txt", "detalhe_processamento.txt");
				 			}
				 		}
				 	}
				);
		
	}

	private ByteArrayInputStream converterByteArrayInputStream(InputStream in) throws IOException {
		byte[] buff = new byte[8000];
		int bytesRead = 0;
		ByteArrayOutputStream bao = new ByteArrayOutputStream();
		while ((bytesRead = in.read(buff)) != -1) {
			bao.write(buff, 0, bytesRead);
		}
		return new ByteArrayInputStream(bao.toByteArray());
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

}
