/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.ingreso;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

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.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FormaPago;
import com.rjconsultores.ventaboletos.entidad.ImpresionLayoutConfig;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtra;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtraEmpresa;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtraFormaPago;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtraPtoVta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.exception.ValidacionCampoException;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.FormaPagoService;
import com.rjconsultores.ventaboletos.service.TipoEventoExtraEmpresaService;
import com.rjconsultores.ventaboletos.service.TipoEventoExtraFormaPagoService;
import com.rjconsultores.ventaboletos.service.TipoEventoExtraPtovtaService;
import com.rjconsultores.ventaboletos.service.TipoEventoExtraService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxImpresionLayoutConfig;
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.MyTextbox;

import jxl.biff.IntegerHelper;
/**
 *
 * @author Rafius
 */
@Controller("editarTipoEventoExtraController")
@Scope("prototype")
public class EditarTipoEventoExtraController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private TipoEventoExtraService tipoEventoExtraService;
	@Autowired
	private TipoEventoExtraEmpresaService tipoEventoExtraEmpresaService;
	@Autowired
	private EmpresaService empresaService;	
	@Autowired
	private TipoEventoExtraPtovtaService tipoEventoExtraPtovtaService;
	@Autowired
	private FormaPagoService formaPagoService;
	@Autowired
	private TipoEventoExtraFormaPagoService tipoEventoExtraFormaPagoService;

	private TipoEventoExtra tipoEventoExtra;
	private MyListbox tipoEventoExtraList;
	private MyListbox empresasList;
	private MyListbox agenciasList;
	private MyTextbox txtNome;
	private Button btnApagar;
	private Button btnSalvar;
	private Textbox impMax;
	private Checkbox cbValidaDocumento;
	private Checkbox cbIndEnviaExcessoDeBagagemSefaz;
	private Radio raTipo11;  
	private Radio raTipo22;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxPuntoVenta cmbPontoVenda;
	private MyComboboxImpresionLayoutConfig cmbImpresionLayoutConfig;
	private MyComboboxImpresionLayoutConfig cmbImpresionLayoutEmailConfig;
	/*Forma de Pagamento*/
	private List<Empresa> lsEmpresas;
	/*Forma de Pagamento*/
	private List<Empresa> lsEmpresasFormapago;	
	private List<FormaPago> lsFormaPago;
	private List<TipoEventoExtraFormaPago> lsTipoEventoExtraFormaPago;
	private List<com.rjconsultores.ventaboletos.constantes.TipoEventoExtra> lsEventoExtrasConstantes;
	private MyComboboxEstandar cmbCveTipoEvento;
	private Row rowIndEnviaExcessoDeBagagemSefaz;
	/*Forma de Pagamento*/
	private Combobox cmbFormaPago;
	/*Forma de Pagamento*/
	private Combobox cmbEmpresaFormaPago;
	private MyListbox formaPagoList;
	private Intbox intboxIndQuantViasImp;
	private List<TipoEventoExtraEmpresa> lsTipoEventoExtraEmpresa;

	private static Logger log = LogManager.getLogger(EditarTipoEventoExtraController.class);

	public TipoEventoExtra getTipoEventoExtra() {
		return tipoEventoExtra;
	}

	public void setTipoEventoExtra(TipoEventoExtra tipoEventoExtra) {
		this.tipoEventoExtra = tipoEventoExtra;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresas = empresaService.obtenerTodosIncluindoEmpresaTodas(); 
		lsEventoExtrasConstantes = Arrays.asList(com.rjconsultores.ventaboletos.constantes.TipoEventoExtra.values());

		super.doAfterCompose(comp); 

		tipoEventoExtra = (TipoEventoExtra) Executions.getCurrent().getArg().get("tipoEventoExtra");
		tipoEventoExtraList = (MyListbox) Executions.getCurrent().getArg().get("tipoEventoExtraList");

		//lsTipoEventoExtraEmpresa = tipoEventoExtra.getTipoeventoextraId() == null ? new ArrayList<TipoEventoExtraEmpresa>() : tipoEventoExtraEmpresaService.buscarPorTipoEventoExtra(tipoEventoExtra);
		empresasList.setData(tipoEventoExtra.getEmpresas());
		agenciasList.setData(tipoEventoExtra.getPontosventa());

		if (tipoEventoExtra.getTipoeventoextraId() != null) {
			cbValidaDocumento.setChecked(tipoEventoExtra.getIndvalidadocumento());
			cbIndEnviaExcessoDeBagagemSefaz.setChecked(tipoEventoExtra.getIndEnviaExcessoDeBagagemSefaz());
			if (tipoEventoExtra.getCvetipoevento()!=null && com.rjconsultores.ventaboletos.constantes.TipoEventoExtra.EXCESSO_BAGAGEM.getDescricao()
					.equalsIgnoreCase(tipoEventoExtra.getCvetipoevento().getDescricao())) {
				rowIndEnviaExcessoDeBagagemSefaz.setVisible(true);
			} else {
				btnApagar.setVisible(false);
				rowIndEnviaExcessoDeBagagemSefaz.setVisible(false);
			}
			cmbImpresionLayoutConfig.setInitialValue(tipoEventoExtra.getImpresionLayoutConfig());
			cmbImpresionLayoutEmailConfig.setInitialValue(tipoEventoExtra.getImpresionLayoutEmailConfig());
		} else {
			rowIndEnviaExcessoDeBagagemSefaz.setVisible(false);
			btnApagar.setVisible(false);
		}

		if (tipoEventoExtra.getIndtipo() != null) {
			if (tipoEventoExtra.getIndtipo().equals("1")) {
				raTipo11.setChecked(Boolean.TRUE);
				raTipo22.setChecked(Boolean.FALSE);
			} else {
				raTipo11.setChecked(Boolean.FALSE);
				raTipo22.setChecked(Boolean.TRUE);
			}
		}

		if( (tipoEventoExtra.getTipoeventoextraId() != null) && (tipoEventoExtra.getTipoeventoextraId() > Constantes.LIMITE_EVENTO_EXTRA_EDITAVEL) ){
			btnApagar.setVisible(false);
			btnSalvar.setVisible(false);
		}

		txtNome.focus();
		
		lsFormaPago = formaPagoService.obtenerTodos();
		lsTipoEventoExtraFormaPago = tipoEventoExtra.getTipoeventoextraId() == null ? new ArrayList<TipoEventoExtraFormaPago>() : tipoEventoExtraFormaPagoService.buscarPorTipoEventoExtra(tipoEventoExtra);
		formaPagoList.setData(lsTipoEventoExtraFormaPago);
		intboxIndQuantViasImp.setValue(tipoEventoExtra.getIndQuantViasImp() == null ? 1 : tipoEventoExtra.getIndQuantViasImp()); 
		intboxIndQuantViasImp.setConstraint(Labels.getLabel("editarFormaPagoController.lbvias.semVazio"));
	}

    public void onChange$intboxIndQuantViasImp(Event event) throws InterruptedException {
        validateIntbox();
    }
    
    private void validateIntbox() throws InterruptedException {
        Integer value = intboxIndQuantViasImp.getValue();

        if (value == null) {
            Messagebox.show(Labels.getLabel("editarFormaPagoController.lbvias.semVazio"), "Erro", Messagebox.OK, Messagebox.INFORMATION);
            intboxIndQuantViasImp.setValue(1);
            return;
        }

        if (value <= 0) {
            Messagebox.show(Labels.getLabel("editarFormaPagoController.lbvias.semNegativo"), "Erro", Messagebox.OK, Messagebox.INFORMATION);
            intboxIndQuantViasImp.setValue(1); 
            return;
        }

        if (value > 5) {
            Messagebox.show(Labels.getLabel("editarFormaPagoController.lbvias.maxCinco"), "Erro", Messagebox.OK, Messagebox.INFORMATION);
            intboxIndQuantViasImp.setValue(1);
            return;
        }
    }
	
	public void onClick$btnRemoverEmpresa(Event ev) throws InterruptedException {
		if (empresasList.getSelectedItem() == null){
			Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.selecionarEmpresa"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		TipoEventoExtraEmpresa t = (TipoEventoExtraEmpresa) empresasList.getSelected();

		tipoEventoExtraEmpresaService.borrar(t);

		tipoEventoExtra.removeEmpresa(t);
		empresasList.setData(tipoEventoExtra.getEmpresas());
	}

	public void onClick$btnAdicionarEmpresa(Event ev) throws InterruptedException {
		if (cmbEmpresa.getSelectedItem() == null){
			Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.selecionarEmpresa"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		Empresa e = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		Boolean achou = Boolean.FALSE;
		if (e != null) {
			for (TipoEventoExtraEmpresa empresas : tipoEventoExtra.getEmpresas()) {
				if (empresas.getEmpresa().equals(e)) {
					achou = Boolean.TRUE;
				}
			}
			if (!achou&&getTipoEventoExtra()!=null){
			   tipoEventoExtraEmpresaService.actualizacion(tipoEventoExtra.addEmpresa(e));
		       empresasList.setData(tipoEventoExtra.getEmpresas());
			}
		}	
	}

	public void onClick$btnAdicionarAgencia(Event ev) throws InterruptedException {
		if (cmbPontoVenda.getSelectedItem() == null){
			Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.selecionarPuntoVenta"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return; 
		}
		PuntoVenta p = (PuntoVenta) cmbPontoVenda.getSelectedItem().getValue();

		tipoEventoExtra.addPuntoVenta(p);

		agenciasList.setData(tipoEventoExtra.getPontosventa());
	}
	
	public void onClick$btnRemoverAgencia(Event ev) throws InterruptedException {
		if (agenciasList.getSelectedItem() == null){
			Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.selecionarPuntoVenta"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		TipoEventoExtraPtoVta t = (TipoEventoExtraPtoVta) agenciasList.getSelected();

		tipoEventoExtraPtovtaService.borrar(t);

		tipoEventoExtra.removePuntoVenta(t);
		agenciasList.setData(tipoEventoExtra.getPontosventa());
	}
	
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		txtNome.getValue();
		impMax.getValue();

		tipoEventoExtra.setIndoperacion(TipoEventoExtra.OPERACION_NORMAL);
		tipoEventoExtra.setIndboleto(Boolean.FALSE);// não valida boleto
		tipoEventoExtra.setPorciva(BigDecimal.ZERO);
		tipoEventoExtra.setIndtipo(raTipo11.isChecked() ? "1" : "0");
		tipoEventoExtra.setIndQuantViasImp(intboxIndQuantViasImp.getValue() == null 
											|| intboxIndQuantViasImp.getValue() <= 0 
												 ? 1 : intboxIndQuantViasImp.getValue());
	
		Comboitem cbDescontoMonitrip = cmbCveTipoEvento.getSelectedItem();
		tipoEventoExtra.setCvetipoevento(null);
		if (cbDescontoMonitrip != null) {
			tipoEventoExtra.setCvetipoevento(
					(com.rjconsultores.ventaboletos.constantes.TipoEventoExtra) cbDescontoMonitrip.getValue());
		}
		
		Comboitem cbImpresionLayoutConfig = cmbImpresionLayoutConfig.getSelectedItem();
		tipoEventoExtra.setImpresionLayoutConfig(null);
		if (cbImpresionLayoutConfig != null) {
			tipoEventoExtra.setImpresionLayoutConfig((ImpresionLayoutConfig) cbImpresionLayoutConfig.getValue());
		}
		
		Comboitem cbImpresionLayoutEmailConfig = cmbImpresionLayoutEmailConfig.getSelectedItem();
		tipoEventoExtra.setImpresionLayoutEmailConfig(null);
		if (cbImpresionLayoutEmailConfig != null) {
			tipoEventoExtra.setImpresionLayoutEmailConfig((ImpresionLayoutConfig) cbImpresionLayoutEmailConfig.getValue());
		}

		try {
			tipoEventoExtra.setActivo(Boolean.TRUE);
			tipoEventoExtra.setFecmodif(Calendar.getInstance().getTime());
			tipoEventoExtra.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			List<TipoEventoExtra> lsTipoEventoExtra = tipoEventoExtraService.buscar(tipoEventoExtra.getDescTipoEvento());
			boolean podeSalvar = false;
			if (lsTipoEventoExtra.isEmpty()) {
				podeSalvar = true;
			} else {
				for (TipoEventoExtra b : lsTipoEventoExtra) {
					if (b.getTipoeventoextraId().equals(tipoEventoExtra.getTipoeventoextraId())) {
						podeSalvar = true;
					}
				}
			}
			if (!podeSalvar) {
				Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarTipoEventoExtraController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			} else {
				tipoEventoExtra.setIndvalidadocumento(cbValidaDocumento.isChecked());
				tipoEventoExtra.setIndEnviaExcessoDeBagagemSefaz(cbIndEnviaExcessoDeBagagemSefaz.isChecked());
				if (tipoEventoExtra.getTipoeventoextraId() == null) {
					tipoEventoExtraService.suscribir(tipoEventoExtra);
					tipoEventoExtraList.addItemNovo(tipoEventoExtra);
				} else {
					tipoEventoExtraService.actualizacion(tipoEventoExtra);
					tipoEventoExtraList.updateItem(tipoEventoExtra);
				}
			}

			Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.suscribirOK"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();

		} catch (ValidacionCampoException ve) {
			log.error("editarTipoEventoExtraController: ", ve);
			Messagebox.show(
					ve.getMessage(),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.ERROR);

		} catch (Exception ex) {
			log.error("editarTipoEventoExtraController: " + ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}
	public void onChange$cmbCveTipoEvento(Event ev) throws InterruptedException {
		if(cmbCveTipoEvento.getSelectedItem()!=null && com.rjconsultores.ventaboletos.constantes.TipoEventoExtra.EXCESSO_BAGAGEM.getDescricao().equalsIgnoreCase(cmbCveTipoEvento.getValue())) {
		
			rowIndEnviaExcessoDeBagagemSefaz.setVisible(true);
		}else {
			rowIndEnviaExcessoDeBagagemSefaz.setVisible(false);
			cbIndEnviaExcessoDeBagagemSefaz.setChecked(false);;
		}
	}
	

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		try {
			int resp = Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.borrarPergunta"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				tipoEventoExtraService.borrar(tipoEventoExtra);

				Messagebox.show(Labels.getLabel("editarTipoEventoExtraController.MSG.borrarOK"),
						Labels.getLabel("editarTipoEventoExtraController.window.title"), Messagebox.OK,
						Messagebox.INFORMATION);

				tipoEventoExtraList.removeItem(tipoEventoExtra);

				closeWindow();
			}

		} catch (BusinessException ex) {
			Messagebox.show(ex.getLocalizedMessage(),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}
	
   
	public void onClick$btnSalvarFormaPago(Event ev) throws InterruptedException {

		cmbFormaPago.getValue();
		
		try {
			FormaPago formaPago = new FormaPago();
			try {
				formaPago = (FormaPago) cmbFormaPago.getSelectedItem().getValue();
				Boolean achou = Boolean.FALSE;
				if (formaPago != null) {
					for (TipoEventoExtraFormaPago fpd : lsTipoEventoExtraFormaPago) {
						if (fpd.getFormapago().equals(formaPago)) {
							achou = Boolean.TRUE;
						}
					}
					if (!achou&&getTipoEventoExtra()!=null){
						TipoEventoExtraFormaPago fpd = new TipoEventoExtraFormaPago();
						fpd.setTipoEventoExtra(getTipoEventoExtra());
						fpd.setFormaPago(formaPago);
						fpd.setActivo(Boolean.TRUE);
						fpd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
						fpd.setFecmodif(Calendar.getInstance().getTime());
						lsTipoEventoExtraFormaPago.add(fpd);
						tipoEventoExtraFormaPagoService.actualizacion(fpd);
						lsTipoEventoExtraFormaPago = tipoEventoExtra.getTipoeventoextraId() == null ? new ArrayList<TipoEventoExtraFormaPago>() : tipoEventoExtraFormaPagoService.buscarPorTipoEventoExtra(tipoEventoExtra);
						formaPagoList.setData(lsTipoEventoExtraFormaPago);
					} else {
						Messagebox.show(
								Labels.getLabel("editarPuntoVentaController.MSG.Achou.FormaPago"),
								Labels.getLabel("editarTipoEventoExtraController.window.title"),
								Messagebox.OK, Messagebox.EXCLAMATION);
					}
				}
			} catch (Exception e) {
				Messagebox.show(
						Labels.getLabel("editarPuntoVentaController.MSG.formaDePago"),
						Labels.getLabel("editarTipoEventoExtraController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTipoEventoExtraController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnApagarFormaPago(Event ev) {
		try {
			TipoEventoExtraFormaPago fpd = (TipoEventoExtraFormaPago) formaPagoList.getSelected();
			if (fpd != null) {
				formaPagoList.removeItem(fpd);
				lsTipoEventoExtraFormaPago.remove(fpd);
				tipoEventoExtraFormaPagoService.borrar(fpd);
				lsTipoEventoExtraFormaPago = tipoEventoExtra.getTipoeventoextraId() == null ? new ArrayList<TipoEventoExtraFormaPago>() : tipoEventoExtraFormaPagoService.buscarPorTipoEventoExtra(tipoEventoExtra);
				formaPagoList.setData(lsTipoEventoExtraFormaPago);
			}
		} catch (Exception ex) {
			log.error(ex);
		}
	}


	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public MyComboboxEstandar getCmbCveTipoEvento() {
		return cmbCveTipoEvento;
	}

	public void setCmbCveTipoEvento(MyComboboxEstandar cmbCveTipoEvento) {
		this.cmbCveTipoEvento = cmbCveTipoEvento;
	}

	public List<com.rjconsultores.ventaboletos.constantes.TipoEventoExtra> getLsEventoExtrasConstantes() {
		return lsEventoExtrasConstantes;
	}

	public void setLsEventoExtrasConstantes(List<com.rjconsultores.ventaboletos.constantes.TipoEventoExtra> lsEventoExtrasConstantes) {
		this.lsEventoExtrasConstantes = lsEventoExtrasConstantes;
	}
	
	private List<Empresa> obterEmpresasUsuarioLogadoComOpcaoTodas() {
		List<Empresa> listaEmpresas = new ArrayList<Empresa>();
		listaEmpresas.add(empresaService.obtenerID(-1));
		listaEmpresas.addAll(UsuarioLogado.getUsuarioLogado().getEmpresa());
		return listaEmpresas;
	}
	
	public List<Empresa> getLsEmpresasFormapago() {
		return lsEmpresasFormapago;
	}

	public void setLsEmpresasFormapago(List<Empresa> lsEmpresasFormapago) {
		this.lsEmpresasFormapago = lsEmpresasFormapago;
	}
	
	public List<FormaPago> getLsFormaPago() {
		return lsFormaPago;
	}

	public void setLsFormaPago(List<FormaPago> lsFormaPago) {
		this.lsFormaPago = lsFormaPago;
	}
	
	public Combobox getCmbFormaPago() {
		return cmbFormaPago;
	}

	public void setCmbFormaPago(Combobox cmbFormaPago) {
		this.cmbFormaPago = cmbFormaPago;
	}
	
	public MyListbox getFormaPagoList() {
		return formaPagoList;
	}

	
}
