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

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

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

import com.rjconsultores.ventaboletos.entidad.GP_Pricing;
import com.rjconsultores.ventaboletos.entidad.GP_PricingClasseTarifaria;
import com.rjconsultores.ventaboletos.entidad.GP_PricingOcupaAntecipa;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.GP_PricingClasseTarifariaService;
import com.rjconsultores.ventaboletos.service.GP_PricingHistoricoService;
import com.rjconsultores.ventaboletos.service.GP_PricingOcupaAntecipaService;
import com.rjconsultores.ventaboletos.utilerias.MoneyHelper;
import com.rjconsultores.ventaboletos.vo.pricing.GP_PricingOcupaAntecipaLegendaVO;
import com.rjconsultores.ventaboletos.vo.pricing.GP_PricingOcupaAntecipaVO;
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;

import ch.stfo.zk.component.Colorbox;

@Controller("editarGP_PricingOcupaAntecipaController")
@Scope("prototype")
public class EditarGP_PricingOcupaAntecipaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(EditarGP_PricingOcupaAntecipaController.class);
	@Autowired
	private GP_PricingOcupaAntecipaService pricingOcupaAntecipaService;
	
	private GP_PricingOcupaAntecipa pricingOcupaAntecipa;
	private MyListbox pricingOcupaAntecipaList;
	private MyListbox pricingOcupaAntecipaLegendaList;
	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<GP_PricingOcupaAntecipa> lsPricingOcupaAntecipa;
	private List<GP_PricingOcupaAntecipaVO> lsPricingOcupaAntecipaVO;
	private List<GP_PricingOcupaAntecipaLegendaVO> lsPricingOcupaAntecipaLegenda;
	private ConstraintPorcentagem ct;
	private Colorbox colorChoose;

	@Autowired
	private GP_PricingClasseTarifariaService pricingClasseTarifariaService;
	private List<GP_PricingClasseTarifaria> lsClasseTarifarias;
	private Combobox cmbPricingClasseTarifaria;
	private MyGenericForwardComposer parentWindow;
	private Map argParentWindow;
	
	@Autowired
	private GP_PricingHistoricoService pricingHistoricoService;

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

		updateEntidad();

		super.doAfterCompose(comp);
		
		parentWindow = (MyGenericForwardComposer) Executions.getCurrent().getArg().get("parentWindow");
		argParentWindow = (Map) Executions.getCurrent().getArg().get("argParentWindow");

		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);
		}
		
		if(pricingOcupaAntecipa != null) {
			pricing = pricingOcupaAntecipa.getPricing();
			pricingOriginal = pricing.clonar();
		}
		
		if (pricingOcupaAntecipa.getCor() != null) {
			colorChoose.setStyle(" background: #FFFFFF; font-style: oblique;");
			colorChoose.setValue(pricingOcupaAntecipa.getCor());
		}
		
	}

	@SuppressWarnings("unchecked")
	private void updateEntidad() {

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

		lsPricingOcupaAntecipa = (List<GP_PricingOcupaAntecipa>) Executions.getCurrent().getArg().get("lsPricingOcupaAntecipa");
		
		if (lsPricingOcupaAntecipa != null && lsPricingOcupaAntecipa.contains(pricingOcupaAntecipa)) {
			pricingOcupaAntecipa = lsPricingOcupaAntecipa.get(lsPricingOcupaAntecipa.indexOf(pricingOcupaAntecipa));
		}
		
		carregarDadosGraficoPricing(lsPricingOcupaAntecipa);
	}

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

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

	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) {
			GP_PricingClasseTarifaria pct = (GP_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 {
					colorChoose.getValue();
					if (colorChoose.getValue() != null) {
						pricingOcupaAntecipa.setCor(colorChoose.getValue());
						ajustarCorMesmoPercentual(pricingOcupaAntecipa);
					}
					
					if (pricingOcupaAntecipa.getPricingocupaantecipaId() != null) {
						pricingOcupaAntecipaService.actualizacion(pricingOcupaAntecipa);
						lsPricingOcupaAntecipa.set(lsPricingOcupaAntecipa.indexOf(pricingOcupaAntecipa), pricingOcupaAntecipa);
					} else {
						pricingOcupaAntecipaService.suscribir(pricingOcupaAntecipa);
						lsPricingOcupaAntecipa.add(pricingOcupaAntecipa);
					}
					
					carregarDadosGraficoPricing(lsPricingOcupaAntecipa);
					
					compararAlteracoesESalvarHistorico();
					
					closeWindow();
				} catch (Exception e) {
					log.error(e.getMessage(), e);
					Messagebox.show(e.getLocalizedMessage(),
							Labels.getLabel("editarPricingController.windowOcupacion.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			}
		}
	}
	
	private void compararAlteracoesESalvarHistorico() {
		try {
			// Busca todas as listas novamente pq nao encontrava novos registros
			pricing.setPricingOcupaAntecipaList(pricingOcupaAntecipaService.obtenerTodoPorPricing(pricing));
			pricingHistoricoService.compararESalvar(pricingOriginal, pricing);
		} catch (Exception e) {
			log.error("Erro ao salvar historico do Pricing Rapido: ", e);
		}
	}

	private void ajustarCorMesmoPercentual(GP_PricingOcupaAntecipa pricingOcupaAntecipa) throws BusinessException {
		for (GP_PricingOcupaAntecipa prOA2 : lsPricingOcupaAntecipa) {
			if(!prOA2.getPricingocupaantecipaId().equals(pricingOcupaAntecipa.getPricingocupaantecipaId()) &&
			   MoneyHelper.isIgual(prOA2.getPorcentaje(), pricingOcupaAntecipa.getPorcentaje())) {
				prOA2.setCor(pricingOcupaAntecipa.getCor());
				pricingOcupaAntecipaService.actualizacion(prOA2);
			}
		}
	}

	private void carregarDadosGraficoPricing(List<GP_PricingOcupaAntecipa> lsPricingOcupaAntecipa) {
		if(lsPricingOcupaAntecipa != null) {
			lsPricingOcupaAntecipaVO = pricingOcupaAntecipaService.carregarPricingOcupaAntecipaVO(lsPricingOcupaAntecipa);
			lsPricingOcupaAntecipaLegenda = pricingOcupaAntecipaService.carregarPricingOcupaAntecipaLegenda(lsPricingOcupaAntecipa);
			pricingOcupaAntecipaList.setData(lsPricingOcupaAntecipaVO);
			pricingOcupaAntecipaLegendaList.setData(lsPricingOcupaAntecipaLegenda);
		}
	}

	public GP_PricingOcupaAntecipa getPricingOcupaAntecipa() {
		return pricingOcupaAntecipa;
	}

	public void setPricingOcupacion(GP_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<GP_PricingClasseTarifaria> getLsClasseTarifarias() {
		return lsClasseTarifarias;
	}

	@Override
	public void closeWindow() {
		argParentWindow.put("gravarNovo", pricingOcupaAntecipa.getPricing() == null || pricingOcupaAntecipa.getPricing().getPricingId() == null);
		argParentWindow.put("isSelecionarTabOcupaAntecipa", true);
		parentWindow.closeWindow();
		parentWindow.openWindow("/gui/gestao_pricing/editarGP_Pricing.zul", Labels.getLabel("editarPricingController.windowOcupacion.title"), argParentWindow);
		super.closeWindow();
	}
	
	public void onClick$btnApagarOcupaAntecipa(Event ev) throws Exception {
		if (pricingOcupaAntecipa != 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) {
				lsPricingOcupaAntecipa.remove(pricingOcupaAntecipa);
				pricingOcupaAntecipaService.borrar(pricingOcupaAntecipa);
				carregarDadosGraficoPricing(lsPricingOcupaAntecipa);
				
				compararAlteracoesESalvarHistorico();
				
				closeWindow();
			}
		} else {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"), Labels.getLabel("editarPricingController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

}
