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

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

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.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.api.Timebox;

import com.rjconsultores.ventaboletos.entidad.CategoriaDescuento;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

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

	private static final long serialVersionUID = 1L;
	private CategoriaDescuento categoriaDescuento;
	private MyListbox categoriaDescuentoList;
	private Radio radioImp;
	private Radio radioPor;
	private Radio radioImprimePassagem;
	private Radio radioNaoImprimePassagem;
	private Textbox descuentoPorc;
	private Textbox descuentoImporte;
	private Row rowTrecho;
	private Row rowTiempo;
	private Timebox timeTempoPermitir;
	private Radio rdCuotaSi;
	private Radio rdTrecho;
	private Combobox cmbIndGeneraFeriado;
	private Label lblMsgTiempo;
	private Spinner spnHora;
	private Spinner spnMinuto;
	private Radio rdVendaAntecipadaSi;
	private Radio rdVendaAntecipadaNo;
	private Radio rdVendeAbertoSi;
	private Radio rdVendaAbertoNao;
	private Radio radioSimVentaSolamenteReserva;
	private Radio radioNaoVentaSolamenteReserva;
	private Row linhaLiberarPoltronasQuandoOnibus;
	private Row linhaAssentosReservados;
	private Textbox asientosReservados;
	private Intbox cantAutorizada;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		categoriaDescuentoList = (MyListbox) Executions.getCurrent().getArg().get("categoriaDescuentoList");
		categoriaDescuento = (CategoriaDescuento) Executions.getCurrent().getArg().get("categoriaDescuento");

		super.doAfterCompose(comp);
		
		popularCombobox(cmbIndGeneraFeriado);

		if ((categoriaDescuento.getDescuentoimporte() != null) && (!categoriaDescuento.getDescuentoimporte().equals(BigDecimal.ZERO))) {
			radioImp.setSelected(true);
			descuentoPorc.setDisabled(true);
		}

		if ((categoriaDescuento.getDescuentoporc() != null) && (!categoriaDescuento.getDescuentoporc().equals(BigDecimal.ZERO))) {
			radioPor.setSelected(true);
			descuentoImporte.setDisabled(true);
		}

		if ((categoriaDescuento.getIndImprimeBoleto() != null) && (categoriaDescuento.getIndImprimeBoleto())) {
			radioImprimePassagem.setSelected(Boolean.TRUE);
		} else if ((categoriaDescuento.getIndImprimeBoleto() != null) && (!categoriaDescuento.getIndImprimeBoleto())) {
			radioNaoImprimePassagem.setSelected(Boolean.TRUE);
		}
		
		if ((categoriaDescuento.getIndVentaSolamenteReserva() != null) && (categoriaDescuento.getIndVentaSolamenteReserva())) {
			radioSimVentaSolamenteReserva.setSelected(Boolean.TRUE);
		} else if ((categoriaDescuento.getIndVentaSolamenteReserva() != null) && (!categoriaDescuento.getIndVentaSolamenteReserva())) {
			radioNaoVentaSolamenteReserva.setSelected(Boolean.TRUE);
		}
		
		if ( (categoriaDescuento.getIndCuota() != null) && (categoriaDescuento.getIndCuota()) ){
			mudarCamposCuota(true);
			timeTempoPermitir.setValue(categoriaDescuento.getTiempoCuota());
			rdCuotaSi.setChecked(true);
			rdTrecho.setChecked(categoriaDescuento.getIndCuotaTramo());
		}else{
			mudarCamposCuota(false);
		}
		
		if (categoriaDescuento.getIndAplicaFeriado() != null) {
			if (categoriaDescuento.getIndAplicaFeriado() .equals("S")) {
				cmbIndGeneraFeriado.setSelectedIndex(0);
			} else if (categoriaDescuento.getIndAplicaFeriado() .equals("F")) {
				cmbIndGeneraFeriado.setSelectedIndex(1);
			} else if (categoriaDescuento.getIndAplicaFeriado() .equals("N")) {
				cmbIndGeneraFeriado.setSelectedIndex(2);
			}
		}
		
		if (categoriaDescuento.getTiempoActivar()!=null){
			rdVendaAntecipadaNo.setChecked(true);
			lblMsgTiempo.setValue(Labels.getLabel("editarConfiguracionCategoriaController.lblVentaAntecipadaTempoActivar.value"));
			preencherDataHora(categoriaDescuento.getTiempoActivar());
		}else if (categoriaDescuento.getTiempoDesactivar() !=null){
			rdVendaAntecipadaSi.setChecked(true);
			lblMsgTiempo.setValue(Labels.getLabel("editarConfiguracionCategoriaController.lblVentaAntecipadaTempoDesactivar.value"));
			preencherDataHora(categoriaDescuento.getTiempoDesactivar());
		}else{
			rdVendaAntecipadaNo.setChecked(true);
			lblMsgTiempo.setValue(Labels.getLabel("editarConfiguracionCategoriaController.lblVentaAntecipadaTempoActivar.value"));
		}
		
		if (categoriaDescuento.getIndVentaAbierto() != null && categoriaDescuento.getIndVentaAbierto()){
			rdVendeAbertoSi.setChecked(true);
		} else {
			rdVendaAbertoNao.setChecked(true);
		}
		
		if(categoriaDescuento.getIndCuota()== true){
			linhaLiberarPoltronasQuandoOnibus.setVisible(true);
			linhaAssentosReservados.setVisible(true);
		}else{
			linhaLiberarPoltronasQuandoOnibus.setVisible(false);
			linhaAssentosReservados.setVisible(false);
		}
	}
	private void preencherDataHora(Integer tiempoMinutos){
		if (tiempoMinutos != null){
			spnHora.setValue(tiempoMinutos/60);
			spnMinuto.setValue(tiempoMinutos%60);
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		if (radioImprimePassagem.isSelected()) {
			categoriaDescuento.setIndImprimeBoleto(Boolean.TRUE);
		} else if (radioNaoImprimePassagem.isSelected()) {
			categoriaDescuento.setIndImprimeBoleto(Boolean.FALSE);
		}
		
		if (radioSimVentaSolamenteReserva.isSelected()) {
			categoriaDescuento.setIndVentaSolamenteReserva(Boolean.TRUE);
		} else if (radioNaoVentaSolamenteReserva.isSelected()) {
			categoriaDescuento.setIndVentaSolamenteReserva(Boolean.FALSE);
		}
		
		if (rdVendaAntecipadaSi.isChecked()){
			int hora = (spnHora.getValue() == null)?0:spnHora.getValue();
			int minuto = (spnMinuto.getValue() == null)?0:spnMinuto.getValue();
			if ( (hora + minuto) == 0){
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.msg.validacaoVentaAntecipada"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				spnHora.focus();
				
				return;
			}
		}
		
		categoriaDescuento.setIndVentaAbierto(rdVendeAbertoSi.isChecked());
		categoriaDescuento.setIndAplicaFeriado((String) cmbIndGeneraFeriado.getSelectedItem().getValue());
		categoriaDescuento.setIndCuota(false);
		categoriaDescuento.setIndCuotaTramo(false);
		if (rdVendaAntecipadaSi.isChecked()){
			categoriaDescuento.setTiempoDesactivar(spnHora.getValue(), spnMinuto.getValue());
		}else{
			categoriaDescuento.setTiempoActivar(spnHora.getValue(), spnMinuto.getValue());
		}
		if (rdCuotaSi.isChecked()){
			if (timeTempoPermitir.getValue() == null){
				throw new WrongValueException(timeTempoPermitir, Labels.getLabel("MSG.CONSTRAINT.CONSTRAINTNUMBERBDOBLIGATORIO"));
			}
			
			categoriaDescuento.setIndCuota(true);
			categoriaDescuento.setIndCuotaTramo(rdTrecho.isChecked());
			categoriaDescuento.setTiempoCuota(timeTempoPermitir.getValue());
		}
		
		if(!validarCampoAssentosReservados()){
			return;
		}
		
		categoriaDescuento.setAsientosReservados(asientosReservados.getValue());
		
		categoriaDescuentoList.updateItem(categoriaDescuento);
		this.closeWindow();
	}
	
	private Boolean validarCampoAssentosReservados() throws InterruptedException{		
		//Verifica se o campo possui números separados por ponto e vírgula.
		//Não permite que outros caracteres sejam digitados.
		if (!asientosReservados.getValue().equals("") && !asientosReservados.getValue().toString().matches("(([1-9]([0-9])+;)|([1-9]([0-9])+)|([1-9];)|([1-9][1-9][1-9])|[1-9])+")){
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.msg.validacaoAssentosReservadosPontoeVirgula"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}		
		//Verifica se a quantidade de assentos reservados é menor que a quantidade de assentos autorizados.
		String assentosReservados[] = asientosReservados.getValue().toString().split(";");
		if(assentosReservados.length > cantAutorizada.getValue()){		
			Messagebox.show(
				Labels.getLabel("editarConfiguracionCategoriaController.msg.validacaoAssentosReservados"),
				Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
				Messagebox.OK, Messagebox.ERROR);
			return false;			
		}		
		
		//Retira possíveis assentos em duplicidade utilizando Set
		if(!asientosReservados.getValue().equals("") && assentosReservados.length > 0){
			Set<String> assentosSemDuplicacao = new HashSet<String>();
			StringBuilder assentos = new StringBuilder();
			assentosSemDuplicacao.addAll(Arrays.asList(assentosReservados));
			assentosReservados = assentosSemDuplicacao.toArray(new String[assentosSemDuplicacao.size()]);
			for(String assento :assentosReservados){
				assentos.append(assento.trim()).append(";");
			}
			assentos.replace(assentos.length()-1, assentos.length(),"");
			asientosReservados.setValue(assentos.toString());
		}	
				
		return true;
	}

	public CategoriaDescuento getCategoriaDescuento() {
		return categoriaDescuento;
	}

	public void setCategoriaDescuento(CategoriaDescuento categoriaDescuento) {
		this.categoriaDescuento = categoriaDescuento;
	}

	public void onClick$radioImp(Event ev) {
		descuentoPorc.setDisabled(true);
		descuentoImporte.setDisabled(false);

		descuentoPorc.setConstraint("");
		descuentoPorc.setValue("0");
		categoriaDescuento.setDescuentoporc(BigDecimal.ZERO);
		descuentoImporte.setConstraint("no empty, no negative");
	}

	public void onClick$radioPor(Event ev) {
		descuentoImporte.setDisabled(true);
		descuentoPorc.setDisabled(false);

		descuentoImporte.setConstraint("");
		descuentoImporte.setValue("0");
		categoriaDescuento.setDescuentoimporte(BigDecimal.ZERO);
		descuentoPorc.setConstraint("no empty, no zero, no negative");
	}
	
	public void onClick$rdCuotaSi(Event ev) {
		mudarCamposCuota(true);
	}
	
	private void mudarCamposCuota(boolean visible){
		rowTrecho.setVisible(visible);
		rowTiempo.setVisible(visible);
		linhaLiberarPoltronasQuandoOnibus.setVisible(visible);
		linhaAssentosReservados.setVisible(visible);		
		timeTempoPermitir.setValue(null);
	}
	public void onClick$rdCuotaNo(Event ev) {
		mudarCamposCuota(false);
	}
	public void popularCombobox(Combobox cmb) throws Exception {

		clearCombobox(cmb);
		for (CategoriaDescuento.DisponibilidadeFeriado p : CategoriaDescuento.DisponibilidadeFeriado.values()) {
			Comboitem comboItem = new Comboitem(p.descricao());
			comboItem.setValue(p.valor());
			comboItem.setParent(cmb);
		}

		cmb.setSelectedIndex(0);
	}
	public void clearCombobox(Combobox combobox) {
		int size = combobox.getItemCount();

		for (int i = size - 1; i >= 0; i--) {
			combobox.removeItemAt(i);
		}
	}

	public void onClick$rdVendaAntecipadaSi(Event ev) {
		spnHora.setValue(0);
		spnMinuto.setValue(0);
		lblMsgTiempo.setValue(Labels.getLabel("editarConfiguracionCategoriaController.lblVentaAntecipadaTempoDesactivar.value"));
	}
	public void onClick$rdVendaAntecipadaNo(Event ev) {
		spnHora.setValue(0);
		spnMinuto.setValue(0);
		lblMsgTiempo.setValue(Labels.getLabel("editarConfiguracionCategoriaController.lblVentaAntecipadaTempoActivar.value"));
	}
	public Row getLinhaLiberarPoltronasQuandoOnibus() {
		return linhaLiberarPoltronasQuandoOnibus;
	}
	public void setLinhaLiberarPoltronasQuandoOnibus(Row linhaLiberarPoltronasQuandoOnibus) {
		this.linhaLiberarPoltronasQuandoOnibus = linhaLiberarPoltronasQuandoOnibus;
	}
	public Row getLinhaAssentosReservados() {
		return linhaAssentosReservados;
	}
	public void setLinhaAssentosReservados(Row linhaAssentosReservados) {
		this.linhaAssentosReservados = linhaAssentosReservados;
	}	
	
}
