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

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.MercadoCompetido;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Plaza;
import com.rjconsultores.ventaboletos.entidad.Tarifa;
import com.rjconsultores.ventaboletos.entidad.TarifaCategoria;
import com.rjconsultores.ventaboletos.entidad.TarifaTipoptovta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.CiudadService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MercadoCompetidoService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.TarifaCategoriaService;
import com.rjconsultores.ventaboletos.service.TarifaService;
import com.rjconsultores.ventaboletos.service.TarifaTipoptovtaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.service.TramoService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
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.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTarifaCategoria;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTarifaTipoPuntoVenta;
import java.math.BigDecimal;
import java.math.BigInteger;
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.zhtml.Messagebox;
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.Comboitem;
import org.zkoss.zul.Textbox;

/**
 * 
 * @author rodrigo
 */
@Controller("editarTarifaController")
@Scope("prototype")
public class EditarTarifaController extends MyGenericForwardComposer {

	@Autowired
	private TarifaService tarifaService;
	@Autowired
	private CiudadService ciudadService;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private TramoService tramoService;
	@Autowired
	private MonedaService monedaService;
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private TipoPuntoVentaService tipoPuntoVentaService;
	@Autowired
	private TarifaCategoriaService tarifaCategoriaService;
	@Autowired
	private TarifaTipoptovtaService tarifaTipoptovtaService;
	@Autowired
	private MercadoCompetidoService mercadoCompetidoService;
	private Tarifa tarifa;
	private MyListbox tarifaList;
	private MyListbox tarifaCategoriaList;
	private MyListbox tarifaTipoPontoVentaList;
	private Combobox cmbTramo;
	private Combobox cmbClaseServicio;
	private Combobox cmbMarca;
	private Combobox cmbCategoria;
	private Combobox cmbTipoPontoVenta;
	private Combobox cmbVigencia;
	private MyTextboxDecimal dbPrecioAbiertoTarifaCategoria;
	private MyTextboxDecimal dbPrecioTarifaCategoria;
	private MyTextboxDecimal dbPrecioTipoPuntoVenta;
	private MyTextboxDecimal dbPrecioAbiertoTipoPuntoVenta;
	private MyTextboxDecimal txtPrecio;
	private MyTextboxDecimal txtPrecioOriginal;
	private MyTextboxDecimal txtPrecioRedAbierto;
	private MyTextboxDecimal txtPedagio;
	private MyTextboxDecimal txtTaxa;
	private MyTextboxDecimal txtSeguro;
	private MyTextboxDecimal txtOutros;
	private Textbox txtDescripcionTramo;
	private List<Marca> lsMarcas;
	private List<ClaseServicio> lsClaseServico;
	private List<Moneda> lsMonedas;
	private List<VigenciaTarifa> lsVigenciaTarifa;
	private List<Categoria> lsCategoria;
	private List<TarifaCategoria> lsTarifaCategoria;
	private List<TarifaTipoptovta> lsTarifaTipoPontoVenta;
	private List<TipoPuntoVenta> lsTipoPontoVenta;
	private Button btnApagar;
	private static Logger log = Logger.getLogger(EditarTarifaController.class);

	public Combobox getCmbVigencia() {
		return cmbVigencia;
	}

	public void setCmbVigencia(Combobox cmbVigencia) {
		this.cmbVigencia = cmbVigencia;
	}

	public Button getBtnApagar() {
		return btnApagar;
	}

	public void setBtnApagar(Button btnApagar) {
		this.btnApagar = btnApagar;
	}

	public Combobox getCmbCategoria() {
		return cmbCategoria;
	}

	public void setCmbCategoria(Combobox cmbCategoria) {
		this.cmbCategoria = cmbCategoria;
	}

	public MyListbox getTarifaCategoriaList() {
		return tarifaCategoriaList;
	}

	public void setTarifaCategoriaList(MyListbox tarifaCategoriaList) {
		this.tarifaCategoriaList = tarifaCategoriaList;
	}

	public Combobox getCmbClaseServicio() {
		return cmbClaseServicio;
	}

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

	public Combobox getCmbMarca() {
		return cmbMarca;
	}

	public void setCmbMarca(Combobox cmbMarca) {
		this.cmbMarca = cmbMarca;
	}

	public Combobox getCmbTramo() {
		return cmbTramo;
	}

	public void setCmbTramo(Combobox cmbTramo) {
		this.cmbTramo = cmbTramo;
	}

	public List<VigenciaTarifa> getLsVigenciaTarifa() {
		return lsVigenciaTarifa;
	}

	public void setLsVigenciaTarifa(List<VigenciaTarifa> lsVigenciaTarifa) {
		this.lsVigenciaTarifa = lsVigenciaTarifa;
	}

	public List<ClaseServicio> getLsClaseServico() {
		return lsClaseServico;
	}

	public void setLsClaseServico(List<ClaseServicio> lsClaseServico) {
		this.lsClaseServico = lsClaseServico;
	}

	public List<Marca> getLsMarcas() {
		return lsMarcas;
	}

	public void setLsMarcas(List<Marca> lsMarcas) {
		this.lsMarcas = lsMarcas;
	}

	public List<Moneda> getLsMonedas() {
		return lsMonedas;
	}

	public void setLsMonedas(List<Moneda> lsMonedas) {
		this.lsMonedas = lsMonedas;
	}

	public Tarifa getTarifa() {
		return tarifa;
	}

	public void setTarifa(Tarifa tarifa) {
		this.tarifa = tarifa;
	}

	public List<Categoria> getLsCategoria() {
		return lsCategoria;
	}

	public void setLsCategoria(List<Categoria> lsCategoria) {
		this.lsCategoria = lsCategoria;
	}

	public List<TipoPuntoVenta> getLsTipoPontoVenta() {
		return lsTipoPontoVenta;
	}

	public void setLsTipoPontoVenta(List<TipoPuntoVenta> lsTipoPontoVenta) {
		this.lsTipoPontoVenta = lsTipoPontoVenta;
	}

	public Combobox getCmbTipoPontoVenta() {
		return cmbTipoPontoVenta;
	}

	public void setCmbTipoPontoVenta(Combobox cmbTipoPontoVenta) {
		this.cmbTipoPontoVenta = cmbTipoPontoVenta;
	}

	public MyListbox getTarifaTipoPontoVentaList() {
		return tarifaTipoPontoVentaList;
	}

	public void setTarifaTipoPontoVentaList(MyListbox tarifaTipoPontoVentaList) {
		this.tarifaTipoPontoVentaList = tarifaTipoPontoVentaList;
	}

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

		lsTarifaCategoria = new ArrayList<TarifaCategoria>();
		tarifaCategoriaList.setItemRenderer(new RenderTarifaCategoria());

		lsTarifaTipoPontoVenta = new ArrayList<TarifaTipoptovta>();
		tarifaTipoPontoVentaList.setItemRenderer(new RenderTarifaTipoPuntoVenta());

		tarifaList = (MyListbox) Executions.getCurrent().getArg().get("tarifaList");
		tarifa = (Tarifa) Executions.getCurrent().getArg().get("tarifa");

		tarifa = tarifaService.obtenerID(tarifa.getTarifaId());

		if (tarifa.getLsTarifaCategoria() != null) {
			lsTarifaCategoria.addAll(tarifa.getLsTarifaCategoria());
		}
		tarifaCategoriaList.setData(lsTarifaCategoria);

		if (tarifa.getLsTarifaTipoptovta() != null) {
			lsTarifaTipoPontoVenta.addAll(tarifa.getLsTarifaTipoptovta());
		}
		tarifaTipoPontoVentaList.setData(lsTarifaTipoPontoVenta);

		lsMarcas = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());

		lsClaseServico = new ArrayList<ClaseServicio>();
		lsClaseServico.add(null);
		lsClaseServico.addAll(claseServicioService.obtenerTodos());

		lsMonedas = new ArrayList<Moneda>();
		lsMonedas.add(null);
		lsMonedas.addAll(monedaService.obtenerTodos());

		lsVigenciaTarifa = new ArrayList<VigenciaTarifa>();
		lsVigenciaTarifa.add(null);
		lsVigenciaTarifa.addAll(vigenciaTarifaService.obtenerTodos());

		lsCategoria = new ArrayList<Categoria>();
		lsCategoria.add(null);
		lsCategoria.addAll(categoriaService.obtenerTodos());

		lsTipoPontoVenta = new ArrayList<TipoPuntoVenta>();
		lsTipoPontoVenta.add(null);
		lsTipoPontoVenta.addAll(tipoPuntoVentaService.obtenerTodos());
		lsTipoPontoVenta.remove(tipoPuntoVentaService.obtenerID((short) -1));

		if (tarifa.getTarifaId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		} else {
			StringBuilder sb = new StringBuilder("");
			sb.append(tarifa.getTramo().getOrigem()).append(" - ").append(tarifa.getTramo().getDestino()).append(" | ").append(tarifa.getTramo().getVia().getNombvia());
			txtDescripcionTramo.setText(sb.toString());

		}
	}

	private void validarObligatorio() {
		txtPrecio.getValue();
		txtPrecioRedAbierto.getValue();
		txtPedagio.getValue();
		txtTaxa.getValue();
		txtSeguro.getValue();
		txtOutros.getValue();
		txtPrecioOriginal.getValue();
	}

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

		tarifa.setFecmodif(Calendar.getInstance().getTime());
		tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		tarifa.setActivo(Boolean.TRUE);
		tarifa.setLsTarifaCategoria(lsTarifaCategoria);
		tarifa.setLsTarifaTipoptovta(lsTarifaTipoPontoVenta);
		tarifa.setPreciooriginal(tarifa.getPrecio());
		

		Comboitem cbiVigenciaTarifa = cmbVigencia.getSelectedItem();
		VigenciaTarifa vigenciaTarifa = null;
		if (cbiVigenciaTarifa != null) {
			vigenciaTarifa = (VigenciaTarifa) cbiVigenciaTarifa.getValue();
		}
		tarifa.setVigenciaTarifa(vigenciaTarifa);

		try {

			try {
				if (tarifa.getTarifaId() == null) {
					tarifaService.suscribir(tarifa);
					tarifaList.addItem(tarifa);

					Messagebox.show(
							Labels.getLabel("editarTarifaController.btnFechar.MSG.SuscbrirOK"),
							Labels.getLabel("editarTarifaController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);

				} else {
					Marca marca = (Marca) (cmbMarca.getSelectedItem() != null ? cmbMarca.getSelectedItem().getValue() : null);
					ClaseServicio claseServicio = (ClaseServicio) (cmbClaseServicio.getSelectedItem() != null ? cmbClaseServicio.getSelectedItem().getValue() : null);
					Parada origem = tarifa.getTramo().getOrigem();
					Parada destino = tarifa.getTramo().getDestino();
					Moneda moneda = tarifa.getMoneda();
					Ciudad cidadeOrigem = null;
					Plaza plaza = null;
					if (origem.getCiudad() != null) {
						cidadeOrigem = ciudadService.obtenerID(origem.getCiudad().getCiudadId());
						plaza = cidadeOrigem.getPlaza();
					}

					// checando se opode alterar o valor da tarifa de acordo com
					// o catalogo de tarifas minimas:
					Boolean podeAlterarTarifaMinima =tarifaService.podeAlterarTarifaMinima(tarifa, marca,origem, destino, claseServicio, plaza, moneda);

					// buscando por Mercado Competido.
					boolean existeMercadoCompetido = mercadoCompetidoService.existe(claseServicio, origem, destino);

					if (podeAlterarTarifaMinima) {

						if (!existeMercadoCompetido) {
							tarifaService.actualizacion(tarifa);
							tarifaList.updateItem(tarifa);

							Messagebox.show(
									Labels.getLabel("editarTarifaController.btnFechar.MSG.SuscbrirOK"),
									Labels.getLabel("editarTarifaController.window.title"),
									Messagebox.OK, Messagebox.INFORMATION);

							closeWindow();
						} else {
							Integer opcao = Messagebox.show(
									Labels.getLabel("editarTarifaController.MSG.MercadoCompetido"),
									Labels.getLabel("editarTarifaController.window.title"),
									Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

							if (opcao.equals(Messagebox.YES)) {
								tarifaService.actualizacion(tarifa);
								tarifaList.updateItem(tarifa);

								Messagebox.show(
										Labels.getLabel("editarTarifaController.btnFechar.MSG.SuscbrirOK"),
										Labels.getLabel("editarTarifaController.window.title"),
										Messagebox.OK, Messagebox.INFORMATION);

								closeWindow();
							}
						}

					} else {
						String stTarifa = tarifa.getTramo() + " - "
								+ tarifa.getPrecio().setScale(2).toString();

						Integer opcao = Messagebox.show(stTarifa + ". "
								+ Labels.getLabel("editarTarifaController.MSG.TarifaMinima"),
								Labels.getLabel("editarTarifaController.window.title"),
								Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

						if (opcao.equals(Messagebox.YES)) {
							tarifaService.actualizacion(tarifa);
							tarifaList.updateItem(tarifa);

							Messagebox.show(
									Labels.getLabel("editarTarifaController.btnFechar.MSG.SuscbrirOK"),
									Labels.getLabel("editarTarifaController.window.title"),
									Messagebox.OK, Messagebox.INFORMATION);

							closeWindow();
						}
					}
				}
			} catch (NumberFormatException ex) {
				log.error("TARIFA - NumberFormatException: " + ex);
			}
		} catch (Exception ex) {
			log.error("Erro ao salvar tarifa: " , ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTarifaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnApagar(Event ev) {
		tarifa.setFecmodif(Calendar.getInstance().getTime());
		tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		tarifa.setActivo(Boolean.TRUE);

		try {
			int opcao = Messagebox.show(
					Labels.getLabel("editarTarifaController.btnFechar.MSG.Deseja.Borrar"),
					Labels.getLabel("editarTarifaController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (opcao == Messagebox.YES) {
				tarifaService.borrar(tarifa);
				tarifaList.removeItem(tarifa);

				Messagebox.show(
						Labels.getLabel("editarTarifaController.btnFechar.MSG.BorrarOK"),
						Labels.getLabel("editarTarifaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				closeWindow();
			}
		} catch (Exception ex) {
			log.error(ex);
		}
	}

	public void onClick$btnAddTarifaCategoria(Event ev) throws InterruptedException {
		cmbCategoria.setConstraint("no empty");
		cmbCategoria.getValue();

		dbPrecioTarifaCategoria.setConstraint("no empty, no zero");
		dbPrecioTarifaCategoria.getValue();

		// dbPrecioAbiertoTarifaCategoria.setConstraint("no empty, no zero");
		// dbPrecioAbiertoTarifaCategoria.getValue();

		Comboitem ciCategoria = cmbCategoria.getSelectedItem();
		Categoria categoria = null;
		if (ciCategoria != null) {
			categoria = (Categoria) ciCategoria.getValue();

			TarifaCategoria tc = new TarifaCategoria();
			tc.setCategoria(categoria);
			tc.setPrecio((dbPrecioTarifaCategoria.getValueDecimal() == null) ? new BigDecimal(BigInteger.ZERO) : dbPrecioTarifaCategoria.getValueDecimal());
			tc.setPrecioredabierto((dbPrecioAbiertoTarifaCategoria.getValueDecimal() == null) ? new BigDecimal(BigInteger.ZERO) : dbPrecioAbiertoTarifaCategoria.getValueDecimal());
			tc.setActivo(Boolean.TRUE);
			tc.setFecmodif(Calendar.getInstance().getTime());
			tc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			boolean existe = false;
			for (TarifaCategoria tCategoria : lsTarifaCategoria) {
				if (tCategoria.getCategoria().equals(tc.getCategoria())) {
					existe = true;
				}
			}
			if (!existe) {
				lsTarifaCategoria.add(tc);
				tarifaCategoriaList.setData(lsTarifaCategoria);
				dbPrecioTarifaCategoria.setConstraint("");
				dbPrecioAbiertoTarifaCategoria.setConstraint("");

				dbPrecioTarifaCategoria.setText("0");
				dbPrecioAbiertoTarifaCategoria.setText("0");

				cmbCategoria.setConstraint("");
				cmbCategoria.setSelectedItem(null);
			} else {
				Messagebox.show(
						Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarTarifaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}

		}
	}

	public void onClick$btnAddTarifaTipoPontoVenta(Event ev) throws InterruptedException {
		cmbTipoPontoVenta.setConstraint("no empty");
		cmbTipoPontoVenta.getValue();

		dbPrecioTipoPuntoVenta.setConstraint("no empty, no zero");
		dbPrecioTipoPuntoVenta.getValue();

		// dbPrecioAbiertoTipoPuntoVenta.setConstraint("no empty, no zero");
		// dbPrecioAbiertoTipoPuntoVenta.getValue();

		Comboitem ciTipoPontoVenta = cmbTipoPontoVenta.getSelectedItem();
		TipoPuntoVenta tipoPuntoVenta = null;
		if (ciTipoPontoVenta != null) {
			tipoPuntoVenta = (TipoPuntoVenta) ciTipoPontoVenta.getValue();

			TarifaTipoptovta tt = new TarifaTipoptovta();
			tt.setTipoPuntoVenta(tipoPuntoVenta);
			tt.setPrecio((dbPrecioTipoPuntoVenta.getValueDecimal() == null) ? new BigDecimal(BigInteger.ZERO) : dbPrecioTipoPuntoVenta.getValueDecimal());
			tt.setPrecioredabierto((dbPrecioAbiertoTipoPuntoVenta.getValueDecimal() == null) ? new BigDecimal(BigInteger.ZERO) : dbPrecioAbiertoTipoPuntoVenta.getValueDecimal());

			tt.setActivo(Boolean.TRUE);
			tt.setFecmodif(Calendar.getInstance().getTime());
			tt.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			boolean existe = false;
			for (TarifaTipoptovta tCategoria : lsTarifaTipoPontoVenta) {
				if (tCategoria.getTipoPuntoVenta().equals(tt.getTipoPuntoVenta())) {
					existe = true;
				}
			}
			if (!existe) {
				lsTarifaTipoPontoVenta.add(tt);
				tarifaTipoPontoVentaList.setData(lsTarifaTipoPontoVenta);

				dbPrecioTipoPuntoVenta.setConstraint("");
				dbPrecioAbiertoTipoPuntoVenta.setConstraint("");

				dbPrecioTipoPuntoVenta.setText("0");
				dbPrecioAbiertoTipoPuntoVenta.setText("0");

				cmbTipoPontoVenta.setConstraint("");
				cmbTipoPontoVenta.setSelectedItem(null);
			} else {
				Messagebox.show(
						Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarTarifaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		}
	}

	public void onClick$btnRmvTarifaCategoria(Event ev) {
		TarifaCategoria tc = (TarifaCategoria) tarifaCategoriaList.getSelected();

		if (tc != null) {
			if (tc.getTarifacategoriaId() != null) {
				tc.setActivo(Boolean.FALSE);
				tc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				tc.setFecmodif(Calendar.getInstance().getTime());

				tarifaCategoriaService.borrar(tc);
			}

			lsTarifaCategoria.remove(tc);
			tarifaCategoriaList.setData(lsTarifaCategoria);
		}
	}

	public void onClick$btnRmvTarifaTipoPontoVenta(Event ev) {
		TarifaTipoptovta tt = (TarifaTipoptovta) tarifaTipoPontoVentaList.getSelected();

		if (tt != null) {
			if (tt.getTarifatipoptovtaId() != null) {
				tt.setActivo(Boolean.FALSE);
				tt.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				tt.setFecmodif(Calendar.getInstance().getTime());

				tarifaTipoptovtaService.borrar(tt);
			}

			lsTarifaTipoPontoVenta.remove(tt);
			tarifaTipoPontoVentaList.setData(lsTarifaTipoPontoVenta);
		}
	}
}
