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

import java.util.ArrayList;
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.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;

import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Plaza;
import com.rjconsultores.ventaboletos.entidad.TarifaEmbarcada;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
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.TarifaEmbarcadaService;
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;

@SuppressWarnings("serial")
@Controller("editarTarifaEmbarcadaController")
@Scope("prototype")
public class EditarTarifaEmbarcadaController extends MyGenericForwardComposer {

	@Autowired
	private TarifaEmbarcadaService tarifaEmbarcadaService;
	
	@Autowired
	private CiudadService ciudadService;
	
	@Autowired
	private MarcaService marcaService;
	
	@Autowired
	private ClaseServicioService claseServicioService;
	
	@Autowired
	private MonedaService monedaService;
	
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	
	@Autowired
	private MercadoCompetidoService mercadoCompetidoService;
	
	private TarifaEmbarcada tarifa;
	private MyListbox tarifaList;
	private Combobox cmbTramo;
	private Combobox cmbClaseServicio;
	private Combobox cmbMarca;
	private Combobox cmbCategoria;
	private Combobox cmbTipoPontoVenta;
	private Combobox cmbVigencia;
	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 Button btnApagar;
	private Button btnSalvar;
	private static Logger log = LogManager.getLogger(EditarTarifaEmbarcadaController.class);

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

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

		tarifa = tarifaEmbarcadaService.obtenerID(tarifa.getTarifaembarcadaId());

		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());

		if (tarifa.getTarifaembarcadaId() == 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();
	}

	@SuppressWarnings("deprecation")
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		validarObligatorio();

		tarifa.setFecmodif(Calendar.getInstance().getTime());
		tarifa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		tarifa.setActivo(Boolean.TRUE);
		tarifa.setPreciooriginal(tarifa.getPreciooriginal());
		

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

		try {

			try {
				if (tarifa.getTarifaembarcadaId() == null) {
					tarifaEmbarcadaService.suscribir(tarifa);
					tarifaList.addItem(tarifa);

					Messagebox.show(
							Labels.getLabel("editarTarifaEmbarcadaController.btnFechar.MSG.SuscbrirOK"),
							Labels.getLabel("editarTarifaEmbarcadaController.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 =tarifaEmbarcadaService.podeAlterarTarifaMinima(tarifa, marca,origem, destino, claseServicio, plaza, moneda);

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

					if (podeAlterarTarifaMinima) {

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

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

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

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

								Messagebox.show(
										Labels.getLabel("editarTarifaEmbarcadaController.btnFechar.MSG.SuscbrirOK"),
										Labels.getLabel("editarTarifaEmbarcadaController.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("editarTarifaEmbarcadaController.window.title"),
								Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

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

							Messagebox.show(
									Labels.getLabel("editarTarifaEmbarcadaController.btnFechar.MSG.SuscbrirOK"),
									Labels.getLabel("editarTarifaEmbarcadaController.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("editarTarifaEmbarcadaController.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("editarTarifaEmbarcadaController.btnFechar.MSG.Deseja.Borrar"),
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

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

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

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

	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 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 TarifaEmbarcada getTarifa() {
		return tarifa;
	}

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

	public Combobox getCmbTipoPontoVenta() {
		return cmbTipoPontoVenta;
	}

	public void setCmbTipoPontoVenta(Combobox cmbTipoPontoVenta) {
		this.cmbTipoPontoVenta = cmbTipoPontoVenta;
	}
	
	public Button getBtnSalvar() {
		return btnSalvar;
	}
	
	public void setBtnSalvar(Button btnSalvar) {
		this.btnSalvar = btnSalvar;
	}
}