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

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.zkforge.fckez.FCKeditor;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.ItemAdicional;
import com.rjconsultores.ventaboletos.entidad.Pacote;
import com.rjconsultores.ventaboletos.entidad.PacoteDescontoBilhete;
import com.rjconsultores.ventaboletos.entidad.PacoteItem;
import com.rjconsultores.ventaboletos.entidad.PacoteTarifa;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TipoTarifaPacote;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.ItemAdicionalService;
import com.rjconsultores.ventaboletos.service.PacoteDescontoBilheteService;
import com.rjconsultores.ventaboletos.service.PacoteItemService;
import com.rjconsultores.ventaboletos.service.PacoteService;
import com.rjconsultores.ventaboletos.service.PacoteTarifaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TipoTarifaPacoteService;
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.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPacoteDescontoBilhete;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPacoteItem;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTarifaPacote;

@Controller("editarConfiguracionPacoteController")
@Scope("prototype")
public class EditarConfiguracionPacoteController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(EditarConfiguracionPacoteController.class);

	@Autowired
	private RutaService rutaService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private PacoteService pacoteService;
	@Autowired
	private PacoteItemService pacoteItemService;
	@Autowired
	private ItemAdicionalService itemAdicionalService;
	@Autowired
	private TipoTarifaPacoteService tipoTarifaPacoteService;
	@Autowired
	private PacoteTarifaService pacoteTarifaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private PacoteDescontoBilheteService pacoteDescontoBilheteService;
	
	private List<Empresa> lsEmpresas;

	private List<Ruta> lsRuta;
	private Combobox cmbRuta;

	private List<ItemAdicional> lsItemAdicional;
	private Combobox cmbItemAdicional;

	private List<TipoTarifaPacote> lsTipoTarifaPacote;
	private Combobox cmbTipoTarifaPacote;

	private Pacote pacote;
	private MyTextbox txtNome;
	private FCKeditor descPacote;
	private Checkbox indVendaAgencia;
	private Radio radIndAutorizado;
	private Radio radIndLatente;
	private Combobox cmbEmpresa;
	
	private Combobox cmbClaseServicio;
	private List<ClaseServicio> lsClaseServicio;
	private MyTextboxDecimal txtPercdesconto;

	private MyListbox pacoteItemList;
	private MyListbox tarifaPacoteList;
	private MyListbox pacoteList;
	private MyListbox pacoteDescontoBilheteList;

	private boolean blockTab;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsRuta = rutaService.obtenerTodos();
		lsItemAdicional = itemAdicionalService.obtenerTodos();
		lsTipoTarifaPacote = tipoTarifaPacoteService.obtenerTodos();
		lsClaseServicio = claseServicioService.buscarTodosExceto(-1);

		pacoteList = (MyListbox) Executions.getCurrent().getArg().get("pacoteList");
		pacote = (Pacote) Executions.getCurrent().getArg().get("pacote");
		
		blockTab = true;

		if (pacote.getPacoteId() != null) {
			pacote = pacoteService.obtenerID(pacote.getPacoteId());
			txtNome.setValue(pacote.getNompacote());
			descPacote.setValue(pacote.getDescpacote());
			indVendaAgencia.setChecked(pacote.getIndvendaagencia());

			Comboitem ci = new Comboitem(pacote.getRuta().toString());
			ci.setAttribute("value", pacote.getRuta());
			ci.setValue(pacote.getRuta());
			ci.setParent(cmbRuta);
			cmbRuta.setSelectedItem(ci);

			if (pacote.getActivo()) {
				radIndAutorizado.setChecked(true);
				radIndLatente.setChecked(false);
			} else {
				radIndAutorizado.setChecked(false);
				radIndLatente.setChecked(true);
			}
			
			if(pacote.getEmpresa() != null) {
				Comboitem ciEmpresa = new Comboitem(pacote.getEmpresa().toString());
				ciEmpresa.setAttribute("value", pacote.getEmpresa());
				ciEmpresa.setValue(pacote.getEmpresa());
				ciEmpresa.setParent(cmbEmpresa);
				cmbEmpresa.setSelectedItem(ciEmpresa);
			}

			pacoteItemList.setData(pacoteItemService.buscaItensPacote(pacote));
			tarifaPacoteList.setData(pacoteTarifaService.buscaTarifasPacote(pacote));
			pacoteDescontoBilheteList.setData(pacoteDescontoBilheteService.obtenerTodos(pacote.getPacoteId()));

			blockTab = false;
		}

		pacoteItemList.setItemRenderer(new RenderPacoteItem());
		pacoteItemList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				removerItemSelecionado();
			}
		});

		tarifaPacoteList.setItemRenderer(new RenderTarifaPacote());
		tarifaPacoteList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				removerTarifaSelecionado();
			}
		});
		
		pacoteDescontoBilheteList.setItemRenderer(new RenderPacoteDescontoBilhete());

	}

	public void onClick$btnSelectItem(Event ev) throws InterruptedException {

		Comboitem cbitem = cmbItemAdicional.getSelectedItem();
		ItemAdicional item = null;
		if (cbitem != null) {
			item = (ItemAdicional) cbitem.getValue();

			if (!pacoteService.verificaCadastroItemAdicional(pacote, item)) {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionPacoteController.MSG.error.itemAdicional"),
						Labels.getLabel("editarConfiguracionPacoteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
		} else {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionPacoteController.MSG.error.cmbItemAdicional"),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		PacoteItem pacoteItem = pacoteItemService.vincularItemPacote(null, pacote, item);
		pacoteItemList.addItemNovo(pacoteItem);

	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnSelectTarifa(Event ev) throws InterruptedException {

		Comboitem cbtarifa = cmbTipoTarifaPacote.getSelectedItem();
		TipoTarifaPacote tarifa = null;
		if (cbtarifa != null) {
			tarifa = (TipoTarifaPacote) cbtarifa.getValue();

			if (!pacoteService.verificaCadastroTarifa(pacote, tarifa)) {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionPacoteController.MSG.error.tipoTarifaPacote"),
						Labels.getLabel("editarConfiguracionPacoteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}

		} else {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionPacoteController.MSG.error.cmbTipoTarifaPacote"),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		Map args = new HashMap();
		args.put("pacote", pacote);
		args.put("tipoTarifaPacote", tarifa);
		args.put("tarifaPacoteList", tarifaPacoteList);

		openWindow("/gui/configuraciones_comerciales/editarPacoteTarifa.zul",
				Labels.getLabel("editarConfiguracionPacoteController.window.title"), args, MODAL);
	}

	public void onClick$btnRemoverItemSelecionado(Event ev) throws InterruptedException {
		removerItemSelecionado();
	}

	public void onClick$btnRemoverTarifaSelecionado(Event ev) throws InterruptedException {
		removerTarifaSelecionado();
	}

	private void removerTarifaSelecionado() throws InterruptedException {
		int resp = Messagebox.show(
				Labels.getLabel("editarConfiguracionPacoteController.tipoTarifa.MSG.borrarPergunta"),
				Labels.getLabel("editarConfiguracionPacoteController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {

			PacoteTarifa pacoteTarifa = (PacoteTarifa) tarifaPacoteList.getSelected();
			pacoteTarifaService.borrar(pacoteTarifa);

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

			tarifaPacoteList.removeItem(pacoteTarifa);
		}
	}

	private void removerItemSelecionado() throws InterruptedException {
		int resp = Messagebox.show(
				Labels.getLabel("editarConfiguracionPacoteController.MSG.borrarPergunta"),
				Labels.getLabel("editarConfiguracionPacoteController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (resp == Messagebox.YES) {

			PacoteItem pacoteItem = (PacoteItem) pacoteItemList.getSelected();
			pacoteItemService.borrar(pacoteItem);

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

			pacoteItemList.removeItem(pacoteItem);
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {

		try {
			Comboitem ciEmpresa = cmbEmpresa.getSelectedItem();
			Comboitem ciRuta = cmbRuta.getSelectedItem();
			Ruta ruta = null;
			if (ciRuta != null) {
				ruta = (Ruta) ciRuta.getValue();
				pacote.setRuta(ruta);
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionPacoteController.MSG.error.cmbRuta"),
						Labels.getLabel("editarConfiguracionPacoteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			if(ciEmpresa != null) {
				Empresa empresa = (Empresa) ciEmpresa.getValue();
				pacote.setEmpresa(empresa);
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionPacoteController.MSG.error.cmbEmpresa"),
						Labels.getLabel("editarConfiguracionPacoteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}

			pacote.setNompacote(txtNome.getValue());

			String descricion = descPacote.getValue();
			if (descricion.length() > 4000) {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionPacoteController.MSG.error.descPacote"),
						Labels.getLabel("editarConfiguracionPacoteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			} else {
				pacote.setDescpacote(descPacote.getValue());
			}

			if (radIndAutorizado.isChecked()) {
				pacote.setActivo(true);
			} else {
				pacote.setActivo(false);
			}

			if (indVendaAgencia.isChecked()) {
				pacote.setIndvendaagencia(true);
			} else {
				pacote.setIndvendaagencia(false);
			}

			if (pacote.getPacoteId() == null) {
				pacoteService.suscribir(pacote);
			} else {
				pacoteList.removeItem(pacote);
				pacoteService.actualizacion(pacote);
			}

			Messagebox.show(
					Labels.getLabel("editarConfiguracionPacoteController.MSG.salvarOK"),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			pacoteList.addItemNovo(pacote);
			closeWindow();

		} catch (WrongValueException ex) {
			throw (WrongValueException) ex;
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error").concat(" - ").concat(ex.toString()),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}

	}
	
	public void onClick$btnAdicionarDescontoBilhete(Event ev) throws InterruptedException {
		txtPercdesconto.getValue();
		try {
			if(validarPacoteDescontoBilhete()) {
				PacoteDescontoBilhete pacoteDescontoBilhete = new PacoteDescontoBilhete();
				pacoteDescontoBilhete.setPercdesconto(txtPercdesconto.getValueDecimal());
				pacoteDescontoBilhete.setPacote(this.pacote);
				pacoteDescontoBilhete.setClaseServicio((ClaseServicio)cmbClaseServicio.getSelectedItem().getValue());
				pacoteDescontoBilheteService.suscribir(pacoteDescontoBilhete);
				pacoteDescontoBilheteList.addItemNovo(pacoteDescontoBilhete);
			}
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error").concat(" - ").concat(ex.toString()),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnRemoverDescontoBilheteSelecionado(Event ev) throws InterruptedException {
		try {
			PacoteDescontoBilhete pacoteDescontoBilhete = (PacoteDescontoBilhete) pacoteDescontoBilheteList.getSelected();
			if(pacoteDescontoBilhete != null) {
				pacoteDescontoBilheteService.borrar(pacoteDescontoBilhete);
				pacoteDescontoBilheteList.removeItem(pacoteDescontoBilhete);
			}
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error").concat(" - ").concat(ex.toString()),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	private boolean validarPacoteDescontoBilhete() throws InterruptedException {
		boolean retorno = true;
		if(cmbClaseServicio.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionPacoteController.MSG.error.cmbClaseServicio"),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			retorno = false;
		}
		if(txtPercdesconto.getValueDecimal() == null) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionPacoteController.MSG.error.txtPercdesconto"),
					Labels.getLabel("editarConfiguracionPacoteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			retorno = false;			
		}
		return retorno;
	}
	public Combobox getCmbRuta() {
		return cmbRuta;
	}

	public void setCmbRuta(Combobox cmbRuta) {
		this.cmbRuta = cmbRuta;
	}

	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

	public void setLsRuta(List<Ruta> lsRuta) {
		this.lsRuta = lsRuta;
	}

	public List<ItemAdicional> getLsItemAdicional() {
		return lsItemAdicional;
	}

	public void setLsItemAdicional(List<ItemAdicional> lsItemAdicional) {
		this.lsItemAdicional = lsItemAdicional;
	}

	public Combobox getCmbItemAdicional() {
		return cmbItemAdicional;
	}

	public void setCmbItemAdicional(Combobox cmbItemAdicional) {
		this.cmbItemAdicional = cmbItemAdicional;
	}

	public List<TipoTarifaPacote> getLsTipoTarifaPacote() {
		return lsTipoTarifaPacote;
	}

	public void setLsTipoTarifaPacote(List<TipoTarifaPacote> lsTipoTarifaPacote) {
		this.lsTipoTarifaPacote = lsTipoTarifaPacote;
	}

	public Combobox getCmbTipoTarifaPacote() {
		return cmbTipoTarifaPacote;
	}

	public void setCmbTipoTarifaPacote(Combobox cmbTipoTarifaPacote) {
		this.cmbTipoTarifaPacote = cmbTipoTarifaPacote;
	}

	public boolean isBlockTab() {
		return blockTab;
	}

	public void setBlockTab(boolean blockTab) {
		this.blockTab = blockTab;
	}

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

	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public Combobox getCmbClaseServicio() {
		return cmbClaseServicio;
	}

	public void setCmbClaseServicio(Combobox cmbClaseServicio) {
		this.cmbClaseServicio = cmbClaseServicio;
	}

	public List<ClaseServicio> getLsClaseServicio() {
		return lsClaseServicio;
	}

	public void setLsClaseServicio(List<ClaseServicio> lsClaseServicio) {
		this.lsClaseServicio = lsClaseServicio;
	}

	public MyTextboxDecimal getTxtPercdesconto() {
		return txtPercdesconto;
	}

	public void setTxtPercdesconto(MyTextboxDecimal txtPercdesconto) {
		this.txtPercdesconto = txtPercdesconto;
	}
}
