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

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.Combobox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.api.Comboitem;

import com.rjconsultores.ventaboletos.entidad.Pricing;
import com.rjconsultores.ventaboletos.entidad.PricingClasseTarifaria;
import com.rjconsultores.ventaboletos.entidad.PricingOcupaAntecipa;
import com.rjconsultores.ventaboletos.service.PricingClasseTarifariaService;
import com.rjconsultores.ventaboletos.service.PricingOcupaAntecipaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.ConstraintPorcentagem;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;

@Controller("editarPricingOcupaAntecipaController")
@Scope("prototype")
public class EditarPricingOcupaAntecipaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(EditarPricingOcupaAntecipaController.class);
	@Autowired
	private PricingOcupaAntecipaService pricingOcupaAntecipaService;
	private PricingOcupaAntecipa pricingOcupaAntecipa;
	private MyListbox pricingOcupaAntecipaList;
	private Intbox ocupacioninicial;
	private Intbox ocupacionfinal;
	private Intbox cantdiasmin;
	private Intbox cantdiasmax;
	private Intbox cantasientosmin;
	private Intbox cantasientosmax;
	private MyTextboxDecimal porcentaje;
	private MyTextboxDecimal importe;
	private List<PricingOcupaAntecipa> lsPricingOcupaAntecipa;
	private ConstraintPorcentagem ct;

	@Autowired
	private PricingClasseTarifariaService pricingClasseTarifariaService;
	private List<PricingClasseTarifaria> lsClasseTarifarias;
	private Combobox cmbPricingClasseTarifaria;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		ct = new ConstraintPorcentagem();

		updateEntidad();

		super.doAfterCompose(comp);

		lsClasseTarifarias = pricingClasseTarifariaService.obtenerTodos();

		if (pricingOcupaAntecipa.getPricingClasseTarifaria() != null) {
			org.zkoss.zul.Comboitem ci = new org.zkoss.zul.Comboitem(pricingOcupaAntecipa.getPricingClasseTarifaria().toString());
			ci.setAttribute("value", pricingOcupaAntecipa.getPricingClasseTarifaria());
			ci.setValue(pricingOcupaAntecipa.getPricingClasseTarifaria());
			ci.setParent(cmbPricingClasseTarifaria);
			cmbPricingClasseTarifaria.setSelectedItem(ci);
		}

	}

	private void updateEntidad() {

		if (pricingOcupaAntecipa == null) {
			pricingOcupaAntecipa = (PricingOcupaAntecipa) Executions.getCurrent().getArg().get("pricingOcupaAntecipa");
			pricingOcupaAntecipaList = (MyListbox) Executions.getCurrent().getArg().get("pricingOcupaAntecipaList");
		}

		lsPricingOcupaAntecipa = pricingOcupaAntecipaService.updateList(pricingOcupaAntecipa);
		pricingOcupaAntecipaList.setData(lsPricingOcupaAntecipa);

		if (lsPricingOcupaAntecipa.contains(pricingOcupaAntecipa)) {
			pricingOcupaAntecipa = lsPricingOcupaAntecipa.get(lsPricingOcupaAntecipa.indexOf(pricingOcupaAntecipa));
		}
	}

	public void onClose$winEditarPricingOcupaAntecipa(Event e) {
		updateEntidad();
	}

	public void onClick$btnCerrar(Event ev) throws Exception {
		updateEntidad();
	}

	public void onClick$btnAdicionarOcupaAntecipa(Event ev) throws Exception {

		if ((cantasientosmin.getValue() != null || cantasientosmax.getValue() != null)
				&& (ocupacioninicial.getValue() != null || ocupacionfinal.getValue() != null)) {
			Messagebox.show(Labels.getLabel("editarPricingController.ocupacionErrada.centoPorCant"),
					Labels.getLabel("editarPricingController.windowOcupacion.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if ((cantasientosmin.getValue() == null && cantasientosmax.getValue() == null)
				&& (cantasientosmin.getValue() == null && cantasientosmax.getValue() == null)
				&& (ocupacioninicial.getValue() == null && ocupacionfinal.getValue() == null)
				&& (ocupacioninicial.getValue() == null && ocupacionfinal.getValue() == null)
				&& (cantdiasmin.getValue() == null && cantdiasmax.getValue() == null)
				&& (cantdiasmin.getValue() == null && cantdiasmax.getValue() == null)) {
			Messagebox.show(Labels.getLabel("editarPricingController.ocupacionErrada.ocAnt"),
					Labels.getLabel("editarPricingController.windowOcupacion.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if ((cantasientosmin.getValue() == null && cantasientosmax.getValue() != null)
				|| (cantasientosmin.getValue() != null && cantasientosmax.getValue() == null)
				|| (ocupacioninicial.getValue() == null && ocupacionfinal.getValue() != null)
				|| (ocupacioninicial.getValue() != null && ocupacionfinal.getValue() == null)
				|| (cantdiasmin.getValue() == null && cantdiasmax.getValue() != null)
				|| (cantdiasmin.getValue() != null && cantdiasmax.getValue() == null)) {
			Messagebox.show(Labels.getLabel("editarPricingController.ocupacionErrada.MinMax"),
					Labels.getLabel("editarPricingController.windowOcupacion.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		Comboitem cbiClasseTarifaria = cmbPricingClasseTarifaria.getSelectedItem();
		if (cbiClasseTarifaria != null) {
			PricingClasseTarifaria pct = (PricingClasseTarifaria) cbiClasseTarifaria.getValue();
			pricingOcupaAntecipa.setPricingClasseTarifaria(pct);
		}

		if (porcentaje.getValueDecimal() != null && importe.getValueDecimal() != null) {

			Messagebox.show(Labels.getLabel("editarPricingController.ocupacionErrada.centoDin"),
					Labels.getLabel("editarPricingController.windowOcupacion.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		} else {
			if (porcentaje.getValueDecimal() == null && importe.getValueDecimal() == null) {

				Messagebox.show(Labels.getLabel("editarPricingController.ocupacionErrada.centoDin"),
						Labels.getLabel("editarPricingController.windowOcupacion.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			} else {
				try {
					if (pricingOcupaAntecipa.getPricingocupaantecipaId() != null) {
						pricingOcupaAntecipaService.actualizacion(pricingOcupaAntecipa);
						pricingOcupaAntecipaList.updateItem(pricingOcupaAntecipa);
					} else {
						pricingOcupaAntecipaService.suscribir(pricingOcupaAntecipa);
						pricingOcupaAntecipaList.addItemNovo(pricingOcupaAntecipa);
					}
					closeWindow();
				} catch (Exception e) {
					Messagebox.show(e.getLocalizedMessage(),
							Labels.getLabel("editarPricingController.windowOcupacion.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			}
		}
	}

	public void onClick$btnRemoverOcupaAntecipa(Event ev) {

		try {
			PricingOcupaAntecipa pOcupacion = (PricingOcupaAntecipa) pricingOcupaAntecipaList.getSelected();
			if (pOcupacion != null) {
				int resp = Messagebox.show(Labels.getLabel("editarPricingController.MSG.borrarPerguntaOcupacion"),
						Labels.getLabel("editarPricingController.windowOcupacion.title"),
						Messagebox.YES | Messagebox.NO,
						Messagebox.QUESTION);

				if (resp == Messagebox.YES) {
					pricingOcupaAntecipa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					pricingOcupaAntecipa.setFecmodif(Calendar.getInstance().getTime());
					pricingOcupaAntecipa.setActivo(Pricing.INATIVO);

					pricingOcupaAntecipaList.removeItem(pricingOcupaAntecipa);
					pricingOcupaAntecipaService.borrar(pricingOcupaAntecipa);
					closeWindow();
				}
			} else {
				Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"),
						Labels.getLabel("editarPricingController.windowOcupacion.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error(ex);
		}

	}

	public PricingOcupaAntecipa getPricingOcupaAntecipa() {
		return pricingOcupaAntecipa;
	}

	public void setPricingOcupacion(PricingOcupaAntecipa pricingOcupaAntecipa) {
		this.pricingOcupaAntecipa = pricingOcupaAntecipa;
	}

	public MyListbox getPricingOcupacionList() {
		return pricingOcupaAntecipaList;
	}

	public void setPricingOcupacionList(MyListbox pricingOcupacionList) {
		this.pricingOcupaAntecipaList = pricingOcupacionList;
	}

	public ConstraintPorcentagem getCt() {
		return ct;
	}

	public void setCt(ConstraintPorcentagem ct) {
		this.ct = ct;
	}

	public List<PricingClasseTarifaria> getLsClasseTarifarias() {
		return lsClasseTarifarias;
	}

}
