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

import java.io.ByteArrayInputStream;
import java.io.IOException;
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.lang.Strings;
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.Comboitem;
import org.zkoss.zul.Fileupload;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.GrupoContrato;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.GrupoContratoService;
import com.rjconsultores.ventaboletos.service.MudancaMassivaContratoService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Controller("mudancaMassivaContratoController")
@Scope("prototype")
public class MudancaMassivaContratoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 8533088874324962380L;
	private static final String TITULO = "mudancaMassivaContratoController.window.title";

	@Autowired
	private MudancaMassivaContratoService mudancaMassivaService;
	
	@Autowired
	private GrupoContratoService grupoService;
	
	private Textbox txtNumContrato;
	private Fileupload fileUpload;
	private List<GrupoContrato> lsGrupo;
	private MyComboboxEstandar cmbGrupo;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		
		setLsGrupo(grupoService.obtenerTodos());
		
		super.doAfterCompose(comp);
	}

	public void onUpload(UploadEvent event) throws IOException, InterruptedException {
		try {
			final String resultado;
			
			validarCampos();
					
			Media media = event.getMedia();
			if(media.getName().toLowerCase().endsWith(".csv")){
				GrupoContrato grupo = null;
				Comboitem grp = cmbGrupo.getSelectedItem();		
				if( grp != null ) {
					grupo = (GrupoContrato) grp.getValue();
				}
				
				resultado = mudancaMassivaService.lerArquivo(media.getStringData(), 
															 txtNumContrato.getValue(), 
															 grupo);
			}else{
				throw new BusinessException("mudancaMassivaContrato.MSG.extensaoInvalida");
			}
	
			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");
					 			}
					 		}
					 	}
					);
		} catch (BusinessException bex) {
			Messagebox.show(
					bex.getMessage(),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.ERROR);			
		} catch (Exception ex) {
			Messagebox.show(
						Labels.getLabel("MSG.Error"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.ERROR);
		}
		
	}
	
	private void validarCampos() throws BusinessException {
		if (cmbGrupo.getSelectedItem() == null && Strings.isBlank(txtNumContrato.getValue()) ){
			throw new BusinessException("mudancaMassivaContrato.MSG.camposObrigatorios");			
		}		
	}

}
