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

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
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.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.Combobox;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.ConvenioTransportadora;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.TarifaConvenioTransport;
import com.rjconsultores.ventaboletos.entidad.Transportadora;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ConvenioTransportadoraService;
import com.rjconsultores.ventaboletos.service.TransportadoraService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTarifaConvenioTransport;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Controller("editarTransportadoraController")
@Scope("prototype")
public class EditarTransportadoraController extends MyGenericForwardComposer {

	private static final String TITULO = "editarTransportadoraController.window.title";
	private static final long serialVersionUID = 1L;
	@Autowired
	private TransportadoraService transportadoraService;
	
	@Autowired
	private ConvenioTransportadoraService convenioService;

	private Transportadora transportadora;
	private MyListbox transportadoraList;
	
	private MyListbox tarifaConvenioList;	
	private List<TarifaConvenioTransport> lsTarifaConvenio;
	private List<TarifaConvenioTransport> lsTarifaConvenioBanco = new ArrayList<>();
	
	private ConvenioTransportadora convenio = new ConvenioTransportadora();

	private Textbox txtNit;
	private Textbox txtNome;
	private Radiogroup rdgClassePagamento;
	
	private Radiogroup rdgTipoConvenio;
	
	//Tarifas
	private Combobox cmbOrigem;	
	private Combobox cmbDestino;
	private Decimalbox txtTarifa;
	
	private Button btnApagar;
	private Button btnSalvar;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		
		super.doAfterCompose(comp);
		
		transportadora = (Transportadora) Executions.getCurrent().getArg().get("transportadora");
		transportadoraList = (MyListbox) Executions.getCurrent().getArg().get("transportadoraList");
		
		tarifaConvenioList.setItemRenderer(new RenderTarifaConvenioTransport());
		lsTarifaConvenio = new ArrayList<TarifaConvenioTransport>();
		
		if(! isRegistroNovo(transportadora.getTransportadoraId()) ) {
			btnApagar.setVisible(transportadora.isActivo());
			btnSalvar.setVisible(transportadora.isActivo());
			convenio = convenioService.buscarPelaTransportadoraId(transportadora.getTransportadoraId());
			if(convenio == null) {
				convenio = new ConvenioTransportadora();
			}
			
			if( convenio.getTarifasConvenio() != null ) {
				lsTarifaConvenio = convenio.getTarifasConvenio();
				tarifaConvenioList.setData(lsTarifaConvenio);
			}
		}
		preencheRadios();
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		try {
			
			if( rdgClassePagamento.getSelectedItem() !=null ) {
				transportadora.setClassePagamento( Integer.valueOf(rdgClassePagamento.getSelectedItem().getValue()));
			}
			
			if( rdgTipoConvenio.getSelectedItem() !=null ) {
				convenio.setTipoConvenio( Integer.valueOf(rdgTipoConvenio.getSelectedItem().getValue()) );
			}
			
			validaCampos();
			
			if (isRegistroNovo(transportadora.getTransportadoraId())) {
                if (transportadoraService.existe(transportadora.getNit())) {
                    Messagebox.show(
                            Labels.getLabel("MSG.Registro.Existe"),
                            Labels.getLabel(TITULO),
                            Messagebox.OK, Messagebox.EXCLAMATION);
                    return;
                }
                transportadora = transportadoraService.suscribir(transportadora);
                transportadoraList.addItemNovo(transportadora);
            } else {
            	transportadora = transportadoraService.actualizacion(transportadora);
                transportadoraList.updateItem(transportadora);
            }
			
			convenio.setTransportadora(transportadora);
			convenio = convenioService.suscribirActualizar(convenio);
            gravarTarifasConvenio();
                
			Messagebox.show(
					Labels.getLabel("MSG.suscribirOK"),
					Labels.getLabel(TITULO),
					Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();		
		} 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 validaCampos() throws BusinessException {
		if ( transportadora.getNit() == null ){
			throw new BusinessException("editarTransportadoraController.MSG.camposObrigatorios");
		}
		
		if (isRegistroNovo(transportadora.getTransportadoraId()) 
				&& transportadoraService.existe(transportadora.getNit())) {
        	throw new BusinessException("editarTransportadoraController.MSG.transportadoraExiste");                
        }		
		
		if ( convenio.getNumConvenio() == null || 
				convenio.getDataInicial() == null || 
				convenio.getDataFinal() == null ||
				convenio.getNomeConvenio() == null ){
			throw new BusinessException("editarTransportadoraController.MSG.camposObrigatoriosConvenio");
		}
		
		if (isRegistroNovo(convenio.getConvenioTransportadoraId()) 
				&& convenioService.existe(convenio)) {
        	throw new BusinessException("editarTransportadoraController.MSG.convenioExiste");                
        }
		
	}

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

		if (resp == Messagebox.YES) {

			transportadoraService.borrar(transportadora);

			Messagebox.show(
						Labels.getLabel("MSG.borrarOK"),
						Labels.getLabel(TITULO),
						Messagebox.OK, Messagebox.INFORMATION);

			transportadoraList.removeItem(transportadora);

			closeWindow();
		}
	}
	
	private void preencheRadios() {
		selecionaRadio(transportadora.getClassePagamento(), rdgClassePagamento);
		selecionaRadio(convenio.getTipoConvenio(), rdgTipoConvenio);
	}
	
	private void gravarTarifasConvenio() {
		convenioService.gravarTarifasConvenio(lsTarifaConvenioBanco);
		convenio.setTarifasConvenio(lsTarifaConvenio);
	}
	
	public void onClick$btnAdicionarTarifa(Event ev) throws InterruptedException { 
		Parada origem = (Parada) cmbOrigem.getSelectedItem().getValue();
		Parada destino = (Parada) cmbDestino.getSelectedItem().getValue();
		BigDecimal valorTarifa = txtTarifa.getValue();
		addTarifaConvenioTransport(origem, destino, valorTarifa);
	}
	
	private void addTarifaConvenioTransport(Parada origem, Parada destino, BigDecimal valorTarifa) throws InterruptedException {				
		TarifaConvenioTransport tarifa = new TarifaConvenioTransport();		
		tarifa.setOrigem(origem);
		tarifa.setDestino(destino);
		tarifa.setConvenioTransportadora(convenio);
		tarifa.setTarifa(valorTarifa);
		tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		tarifa.setFecModif(Calendar.getInstance().getTime());
		tarifa.setActivo(true);
		
		if( validaExisteTarifa(tarifa)) {		
			Messagebox.show(
	                Labels.getLabel("editarConvenioTransportController.MSG.tarifaExiste"),
	                Labels.getLabel(TITULO),
	                Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		lsTarifaConvenioBanco.add(tarifa);
		lsTarifaConvenio.add(tarifa);
		tarifaConvenioList.setData(lsTarifaConvenio);
		
	}
	
	public void onClick$btnRemoverTarifa(Event ev) {
		TarifaConvenioTransport tarifa = (TarifaConvenioTransport) tarifaConvenioList.getSelected();
		if(tarifa != null) {
			lsTarifaConvenio.remove(tarifa);
			tarifaConvenioList.setData(lsTarifaConvenio);
			
			if( tarifa.getTarifaConvenioId() != null ) {
				tarifa.setActivo(false);
				tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				tarifa.setFecModif(Calendar.getInstance().getTime());
				lsTarifaConvenioBanco.add(tarifa);
			}else {				
				lsTarifaConvenioBanco.remove(lsTarifaConvenioBanco.indexOf(tarifa));
			}
		}
	}
	
	private boolean validaExisteTarifa(TarifaConvenioTransport tarifa) {
		for (TarifaConvenioTransport item : lsTarifaConvenio) {
			if( item.getOrigem().equals(tarifa.getOrigem()) 
					&& item.getDestino().equals(tarifa.getDestino()) ) {
				return true;
			}
		}
		return false;
	}

}
