/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
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.apache.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.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.CancelacionCargo;
import com.rjconsultores.ventaboletos.entidad.CancelacionCtrl;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.MotivoCancelacion;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.CancelacionCtrlService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MotivoCancelacionService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCancelacionCargo;

/**
 * 
 * @author Rafius
 */
@Controller("editarConfiguracionCancelacionController")
@Scope("prototype")
public class EditarConfiguracionCancelacionController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private CancelacionCtrlService cancelacionCtrlService;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private MotivoCancelacionService motivoCancelacionService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	private CancelacionCtrl cancelacionCtrl;
	private static Logger log = Logger.getLogger(EditarConfiguracionCancelacionController.class);
	private List<PuntoVenta> lsPuntoVenta;
	private List<Marca> lsMarca;
	private List<CancelacionCargo> lsCancelacionCargo;
	private List<MotivoCancelacion> lsMotivoCancelacion;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private Combobox cmbMarca;
	private Combobox cmbPuntoVenta;
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParada cmbParadaDestino;
	private Combobox cmbMotivoCancelacion;
	private MyListbox cancelacionCtrlList;
	private MyListbox cancelacionCargoList;
	private Button btnApagar;
	private MyTextboxDecimal txtMinimo;
	private MyTextboxDecimal txtMaximo;
	private Textbox porcentaje;
	private Textbox importe;
	private Radio radioImp;
	private Tab tabCtrl;

	public CancelacionCtrl getCancelacionCtrl() {
		return cancelacionCtrl;
	}

	public void setCancelacionCtrl(CancelacionCtrl cancelacionCtrl) {
		this.cancelacionCtrl = cancelacionCtrl;
	}

	public List<Marca> getLsMarca() {
		return lsMarca;
	}

	public void setLsMarca(List<Marca> lsMarca) {
		this.lsMarca = lsMarca;
	}

	public List<PuntoVenta> getLsPuntoVenta() {
		return lsPuntoVenta;
	}

	public void setLsPuntoVenta(List<PuntoVenta> lsPuntoVenta) {
		this.lsPuntoVenta = lsPuntoVenta;
	}

	public List<CancelacionCargo> getLsCancelacionCargo() {
		return lsCancelacionCargo;
	}

	public void setLsCancelacionCargo(List<CancelacionCargo> lsCancelacionCargo) {
		this.lsCancelacionCargo = lsCancelacionCargo;
	}

	public List<MotivoCancelacion> getLsMotivoCancelacion() {
		return lsMotivoCancelacion;
	}

	public void setLsMotivoCancelacion(List<MotivoCancelacion> lsMotivoCancelacion) {
		this.lsMotivoCancelacion = lsMotivoCancelacion;
	}

	public List<OrgaoConcedente> getLsOrgaoConcedente() {
		return lsOrgaoConcedente;
	}

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsMarca = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
		lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
		lsMotivoCancelacion = motivoCancelacionService.obtenerTodos();

		super.doAfterCompose(comp);

		cancelacionCtrl = (CancelacionCtrl) Executions.getCurrent().getArg().get("cancelacionCtrl");
		cancelacionCtrlList = (MyListbox) Executions.getCurrent().getArg().get("cancelacionCtrlList");

		cancelacionCargoList.setItemRenderer(new RenderCancelacionCargo());
		lsCancelacionCargo = new ArrayList<CancelacionCargo>();

		if (cancelacionCtrl.getCancelacionctrlId() == null) {
			btnApagar.setVisible(Boolean.FALSE);

			radioImp.setChecked(true);
			onClick$radioImp(null);

		} else {
			cancelacionCtrl = cancelacionCtrlService.obtenerID(cancelacionCtrl.getCancelacionctrlId());

			lsCancelacionCargo = cancelacionCtrl.getCancelacionCargoList();
			cancelacionCargoList.setData(lsCancelacionCargo);

			Parada origem = cancelacionCtrl.getParadaOrigem();
			if (origem != null) {
				cmbParadaOrigem.setValue(origem.getDescparada());
			}

			Parada destino = cancelacionCtrl.getParadaDestino();
			if (destino != null) {
				cmbParadaDestino.setValue(destino.getDescparada());
			}
			PuntoVenta puntoVenta = cancelacionCtrl.getPuntoVenta();
			if (puntoVenta != null) {
				List<PuntoVenta> ls = new ArrayList<PuntoVenta>();
				ls.add(puntoVenta);

				cmbPuntoVenta.setModel(new BindingListModelList(ls, false));
				cmbPuntoVenta.setText(puntoVenta.getNombpuntoventa());
			}

			// Habilitar tempo conforme motivo de cancelacion.
			motivosCancelacion();
		}

		importe.setDisabled(true);
		porcentaje.setDisabled(true);

		radioImp.setChecked(true);
		onClick$radioImp(null);

		cmbMotivoCancelacion.focus();
	}

	public void motivosCancelacion() {
		if(!txtMaximo.getValue().equals("") && txtMinimo.getValue().equals("")){
			txtMinimo.setValue("");
			txtMinimo.setDisabled(true);
		}else if(!txtMinimo.getValue().equals("") && txtMaximo.getValue().equals("")){
			txtMaximo.setValue("");
			txtMaximo.setDisabled(true);
		}else{
			txtMaximo.setDisabled(false);
			txtMinimo.setDisabled(false);
		}
		
	}
	
	public void onChange$txtMaximo(Event e){
		motivosCancelacion();
	}
	public void onChange$txtMinimo(Event e){
		motivosCancelacion();
	}

	public void onChange$cmbParadaOrigem(Event e) {
		Comboitem origem = cmbParadaOrigem.getSelectedItem();
		if (origem != null) {
			Parada ori = (Parada) origem.getValue();
			if (ori.getParadaId().equals(-1)) {
				cmbParadaDestino.setText(ori.getDescparada());
				cmbParadaDestino.setInitialValue(ori);
				cancelacionCtrl.setParadaOrigem(ori);
				cancelacionCtrl.setParadaDestino(ori);
			}
		}
	}

	public void onChange$cmbParadaDestino(Event e) {
		Comboitem destino = cmbParadaDestino.getSelectedItem();
		if (destino != null) {
			Parada des = (Parada) destino.getValue();
			if (des.getParadaId().equals(-1)) {
				cmbParadaOrigem.setText(des.getDescparada());
				cmbParadaOrigem.setInitialValue(des);
				cancelacionCtrl.setParadaOrigem(des);
				cancelacionCtrl.setParadaDestino(des);
			}
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		// Motivo de cancelacion pode ser branco
		cmbMotivoCancelacion.getValue();
		tabCtrl.setSelected(Boolean.TRUE);
		cmbPuntoVenta.getValue();
		cmbMarca.setConstraint("no empty");
		cmbMarca.getValue();
		cmbParadaOrigem.getValue(true);
		cmbParadaDestino.getValue(true);

		PuntoVenta punto = (PuntoVenta) (cmbPuntoVenta.getSelectedItem() == null ? null : cmbPuntoVenta.getSelectedItem().getValue());
		if (punto != null) {
			cancelacionCtrl.setPuntoVenta(punto);
		} else {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionGeneralController.MSG.punto"),
					Labels.getLabel("editarConfiguracionCancelacionController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}

		Comboitem cbiMotivo = cmbMotivoCancelacion.getSelectedItem();
		MotivoCancelacion motivo = new MotivoCancelacion();
		if (cbiMotivo != null) {
			motivo = (MotivoCancelacion) cbiMotivo.getValue();
			cancelacionCtrl.setMotivoCancelacion(motivo);
		} else {
			cancelacionCtrl.setMotivoCancelacion(null);
		}

		Parada origem = cancelacionCtrl.getParadaOrigem();
		Parada destino = cancelacionCtrl.getParadaDestino();

		try {
			boolean podeIguais = false;
			if (origem.getParadaId().equals(destino.getParadaId())) {
				if (origem.getParadaId().equals(-1) && destino.getParadaId().equals(-1)) {
					podeIguais = true;
				}
			} else {
				if (origem.getParadaId().equals(-1) || destino.getParadaId().equals(-1)) {
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCancelacionController.MSG.selectItemTodas"),
							Labels.getLabel("editarConfiguracionCancelacionController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;

				} else {
					podeIguais = true;
				}
			}

			if (podeIguais) {
				cancelacionCtrl.setActivo(Boolean.TRUE);
				cancelacionCtrl.setFecmodif(Calendar.getInstance().getTime());
				cancelacionCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				cancelacionCtrl.setMarca((Marca) cmbMarca.getSelectedItem().getValue());

				List<CancelacionCtrl> lsCancelacion = cancelacionCtrlService.buscar(cancelacionCtrl.getTiempoprevsalida(),
						cancelacionCtrl.getPuntoVenta(), cancelacionCtrl.getParadaOrigem(),
						cancelacionCtrl.getParadaDestino(), cancelacionCtrl.getMarca());

				boolean podeSalvar = false;
				if (lsCancelacion.isEmpty()) {
					podeSalvar = true;
				} else {
					for (CancelacionCtrl cc : lsCancelacion) {
						if (cc.getCancelacionctrlId().equals(cancelacionCtrl.getCancelacionctrlId())) {
							podeSalvar = true;
						}
					}
				}

				if (podeSalvar) {

					if (cancelacionCtrl.getCancelacionctrlId() == null) {
						cancelacionCtrlService.suscribir(cancelacionCtrl);
						cancelacionCtrlList.addItem(cancelacionCtrl);
					} else {
						cancelacionCtrlService.actualizacion(cancelacionCtrl);
						cancelacionCtrlList.updateItem(cancelacionCtrl);
					}

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

					closeWindow();
				} else {
					Messagebox.show(
							Labels.getLabel("MSG.Registro.Existe"),
							Labels.getLabel("editarConfiguracionGeneralController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCancelacionController.MSG.selectItemDiferente"),
						Labels.getLabel("editarConfiguracionCancelacionController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

			}
		} catch (Exception ex) {
			log.error("",ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCategoriaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

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

			if (resp == Messagebox.YES) {

				cancelacionCtrlService.borrar(cancelacionCtrl);

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

				cancelacionCtrlList.removeItem(cancelacionCtrl);

				closeWindow();
			}
		} catch (Exception ex) {
			log.error("",ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCategoriaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onChange$cmbMotivoCancelacion(Event ev) {
		Comboitem cbiMotivo = cmbMotivoCancelacion.getSelectedItem();
		MotivoCancelacion motivo = new MotivoCancelacion();
		if (cbiMotivo != null) {
			motivo = (MotivoCancelacion) cbiMotivo.getValue();

			cancelacionCtrl.setMotivoCancelacion(motivo);
			motivosCancelacion();
		}
	}

	public void onClick$radioImp(Event ev) {
		importe.setConstraint("");
		porcentaje.setConstraint("");

		importe.setText("");
		porcentaje.setText("");

		porcentaje.setDisabled(true);
		importe.setDisabled(false);

		porcentaje.setConstraint("");
		porcentaje.setValue("");
		importe.setConstraint("no empty, no negative");
	}

	public void onClick$radioPor(Event ev) {
		importe.setConstraint("");
		porcentaje.setConstraint("");

		importe.setText("");
		porcentaje.setText("");

		importe.setDisabled(true);
		porcentaje.setDisabled(false);

		importe.setConstraint("");
		importe.setValue("");
		porcentaje.setConstraint("no empty, no zero, no negative");
	}

	public void onClick$btnAdicionarCargo(Event ev) throws InterruptedException {
		txtMinimo.getValue();
		txtMaximo.getValue();
		porcentaje.getValue();
		importe.getValue();

		try {

			boolean existe = false;
			for (CancelacionCargo cc : lsCancelacionCargo) {
				if(cc.getTiempominimo()!= null && txtMaximo!=null && !txtMaximo.getValue().isEmpty()
						&& txtMaximo.getValueDecimal().compareTo(cc.getTiempominimo()) > 0){
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCancelacionController.MSG.tempoMaximoMaior"),
							Labels.getLabel("editarCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;
					 
				}else if(cc.getTiempomaximo()!= null && txtMinimo!=null && txtMinimo.getValueDecimal()!= null
						&& txtMinimo.getValueDecimal().compareTo(cc.getTiempomaximo()) < 0){
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCancelacionController.MSG.tempoMinimoMenor"),
							Labels.getLabel("editarCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;
				}
				if (cc.getTiempomaximo() == null) {
					continue;
				}
				
			}

			if (!existe) {
				CancelacionCargo cCargo = new CancelacionCargo();
				cCargo.setCancelacionCtrl(cancelacionCtrl);
				cCargo.setActivo(Boolean.TRUE);
				cCargo.setFecmodif(Calendar.getInstance().getTime());
				cCargo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

				cCargo.setTiempominimo(txtMinimo.getValueDecimal());
				cCargo.setTiempomaximo(txtMaximo.getValueDecimal());
				if ((!porcentaje.getValue().equals("")) && (porcentaje.getValue() != null)) {
					cCargo.setPorccargo((BigDecimal.valueOf(Double.parseDouble(porcentaje.getValue()))));
				}
				if ((!importe.getValue().equals("")) && (importe.getValue() != null)) {
					cCargo.setImportecargo((BigDecimal.valueOf(Double.parseDouble(importe.getValue()))));
				}
				lsCancelacionCargo.add(cCargo);
				cancelacionCtrl.setCancelacionCargoList(lsCancelacionCargo);

				txtMaximo.setConstraint("");
				txtMinimo.setConstraint("");

				txtMinimo.setText("");
				txtMaximo.setText("");

				importe.setDisabled(true);
				porcentaje.setDisabled(true);
				radioImp.setChecked(true);

				onClick$radioImp(null);
				motivosCancelacion();

				cancelacionCargoList.setData(new ArrayList<CancelacionCargo>());
				List<CancelacionCargo> lsTemp = new ArrayList<CancelacionCargo>();
				for (CancelacionCargo cc : lsCancelacionCargo) {
					if (cc.getActivo()) {
						lsTemp.add(cc);
					}
				}

				cancelacionCargoList.setData(lsTemp);
			} else {
				Messagebox.show(
						Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarConfiguracionCancelacionController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("Erro adicionar cargo" ,ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCategoriaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnRemoverCargo(Event ev) throws InterruptedException {
		try {
			CancelacionCargo cCargo = (CancelacionCargo) cancelacionCargoList.getSelected();
			if (cCargo != null) {
				// removo o antigo
				lsCancelacionCargo.remove(cCargo);
				cCargo.setFecmodif(Calendar.getInstance().getTime());
				cCargo.setActivo(Boolean.FALSE);
				cCargo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				cancelacionCargoList.updateItem(cCargo);
				cancelacionCargoList.removeItem(cCargo);
				lsCancelacionCargo.add(cCargo);

			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCancelacionController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("Erro remover cargo: " + ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCancelacionController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}
}
