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

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.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OCDParam;
import com.rjconsultores.ventaboletos.entidad.OCDPtoVtaParam;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OCDParamService;
import com.rjconsultores.ventaboletos.service.OCDPtoVtaParamService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderOCDPtoVtaParam;

@Controller("editarOCDParamController")
@Scope("prototype")
public class EditarOCDParamController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	@Autowired
	private OCDParamService ocdParamService;
	
	@Autowired
	private OCDPtoVtaParamService ocdPtoVtaParamService ;
		
	@Autowired
	private EmpresaService empresaService;
	
	@Autowired
	private ConstanteService constanteService;
	
	private OCDParam ocdParamCorrente;
	
	private MyListbox ocdParamList;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	
	private Combobox cmbEmpresa;
	private List<Empresa> lsEmpresas;
	private List<PuntoVenta> lsPuntoVenta;

	private Textbox txtDiasPagar;
	private Textbox txtPenalizacion;
	private Textbox txtTiempoLimitePenalizacion;
	
	private Button btnApagar;
	private Button btnApagarPtoVtaOCDParam;
	private Button btnAdicionarPtoVtaOCDParam;
	private MyListbox ptoVtaOCDParamList;
	private Checkbox chkOCDDefault;
	private Checkbox chkOCDTroca;
	private Checkbox chkOCDTransferencia;
	private Radio rdPenalizacionOCD;
	private Radio rdPenalizacionOrgaoConcedente;
	private Checkbox chkIndtotalbilhete;
	private Checkbox chkIndsempregerarapagar;
	private Checkbox chkIndReembolsoAdmin;
	private Checkbox chkIndOCDPorFormadePagamento;
	private Row rowIndOCDPorFormadePagamento;	
	private Row rowIndReembolsoAdmin;
	private Checkbox chkindEstornoPix;

	
	private Radio rdSomenteCartao;
	private Radio rdTodasFormasPagamento;

	private static Logger log = LogManager.getLogger(EditarOCDParamController.class);
	
	public Button getBtnApagar() {
		return btnApagar;
	}

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

	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {		
		
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		
		super.doAfterCompose(comp);
		
		ocdParamCorrente = (OCDParam) Executions.getCurrent().getArg().get("ocdParamCorrente");
		ocdParamList = (MyListbox) Executions.getCurrent().getArg().get("ocdParamList");
		chkOCDDefault.setChecked(ocdParamCorrente.getIndOCDDefault() == null ? false : ocdParamCorrente.getIndOCDDefault());
		chkOCDTroca.setChecked(ocdParamCorrente.getIndOCDTroca() == null ? false : ocdParamCorrente.getIndOCDTroca());
		chkOCDTransferencia.setChecked(ocdParamCorrente.getIndOCDTransferencia() == null ? false : ocdParamCorrente.getIndOCDTransferencia());
		chkIndtotalbilhete.setChecked(ocdParamCorrente.getIndtotalbilhete() == null ? false : ocdParamCorrente.getIndtotalbilhete());
		chkIndsempregerarapagar.setChecked(ocdParamCorrente.getIndsempregerarapagar() == null ? false : ocdParamCorrente.getIndsempregerarapagar());
		chkIndReembolsoAdmin.setChecked(ocdParamCorrente.getIndReembolsoAdmin());
		rowIndReembolsoAdmin.setVisible(ocdParamCorrente.getIndOcdDinheiro());
		chkIndOCDPorFormadePagamento.setChecked(ocdParamCorrente.getIndOCDPorFormadePagamento() == null ? false : ocdParamCorrente.getIndOCDPorFormadePagamento());
		rowIndOCDPorFormadePagamento.setVisible(!ocdParamCorrente.getIndOcdDinheiro());
		txtPenalizacion.setDisabled(!ocdParamCorrente.getIndPenalizacionOCD());
		txtTiempoLimitePenalizacion.setDisabled(!ocdParamCorrente.getIndPenalizacionOCD());
		ptoVtaOCDParamList.setItemRenderer(new RenderOCDPtoVtaParam());
		initRadios(ocdParamCorrente.getIndPenalizacionOCD());
		if (ocdParamCorrente.getOcdparamId() == null){
			btnApagar.setVisible(Boolean.FALSE);
			ocdParamCorrente.setListOCDPtoVtaParam(new ArrayList<OCDPtoVtaParam>());
		}else{
			ptoVtaOCDParamList.setData(removerOCDPtoVtaParamInativo(ocdParamCorrente.getListOCDPtoVtaParam()));
		}
		chkindEstornoPix.setChecked(ocdParamCorrente.getIndEstornoPix());
	}
	
	private List<OCDPtoVtaParam> removerOCDPtoVtaParamInativo(List<OCDPtoVtaParam> listOCDPtoVtaParam){
		List<OCDPtoVtaParam> retorno = new ArrayList<OCDPtoVtaParam>();
		for (OCDPtoVtaParam ocdPtoVtaParam : listOCDPtoVtaParam) {
			if(ocdPtoVtaParam.getActivo()){
				retorno.add(ocdPtoVtaParam);
			}
		}
		return retorno;
	}

	private void initRadios(Boolean indPenalizacionOCD) {
		rdPenalizacionOCD.setChecked(ocdParamCorrente.getIndPenalizacionOCD());
		rdPenalizacionOrgaoConcedente.setChecked(!ocdParamCorrente.getIndPenalizacionOCD());
		rdSomenteCartao.setChecked(!ocdParamCorrente.getIndOcdDinheiro());
		rdTodasFormasPagamento.setChecked(ocdParamCorrente.getIndOcdDinheiro());
	}
	
	public void onClick$rdSomenteCartao(Event ev) throws InterruptedException {
		if(rdSomenteCartao.isChecked()) {
			rowIndOCDPorFormadePagamento.setVisible(true);
			rowIndReembolsoAdmin.setVisible(false);
			chkIndReembolsoAdmin.setChecked(false);	
		}		
	}
	
	public void onClick$rdTodasFormasPagamento(Event ev)  throws InterruptedException {
		if(rdTodasFormasPagamento.isChecked()) {
			rowIndOCDPorFormadePagamento.setVisible(false);
			chkIndOCDPorFormadePagamento.setChecked(false);	
			rowIndReembolsoAdmin.setVisible(true);

		}		
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		try {
            int resp = Messagebox.show(
                    Labels.getLabel("editarOCDParamController.MSG.borrarPergunta"),
                    Labels.getLabel("editarOCDParamController.window.title"),
                    Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

            if (resp == Messagebox.YES) {

            	ocdParamService.borrar(ocdParamCorrente);

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

                closeWindow();
            } 
        } catch (Exception ex) {
            log.error(ex);
        }
		
	}
	
	public void onClick$rdPenalizacionOCD(Event ev) {
		if(rdPenalizacionOCD.isChecked()) {
			txtPenalizacion.setDisabled(Boolean.FALSE);
			txtTiempoLimitePenalizacion.setDisabled(Boolean.FALSE);
		}
	}
	
	public void onClick$rdPenalizacionOrgaoConcedente(Event ev) {
		if (rdPenalizacionOrgaoConcedente.isChecked()) {
			txtPenalizacion.setDisabled(Boolean.TRUE);
			txtPenalizacion.setValue("");
			txtTiempoLimitePenalizacion.setDisabled(Boolean.TRUE);
			txtTiempoLimitePenalizacion.setValue("");
		}
	}	
	
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		
		cmbEmpresa.getValue();
		boolean isSuscribir = false;
		
		try{
						
			ocdParamCorrente.setActivo(true);
			ocdParamCorrente.setFecmodif(Calendar.getInstance().getTime());
			ocdParamCorrente.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			ocdParamCorrente.setIndOCDDefault(chkOCDDefault.isChecked());
			ocdParamCorrente.setIndOCDTroca(chkOCDTroca.isChecked());
			ocdParamCorrente.setIndOCDTransferencia(chkOCDTransferencia.isChecked());
			ocdParamCorrente.setIndPenalizacionOCD(rdPenalizacionOCD.isChecked());
			ocdParamCorrente.setIndOcdDinheiro(rdTodasFormasPagamento.isChecked());
			ocdParamCorrente.setIndOCDPorFormadePagamento(chkIndOCDPorFormadePagamento.isChecked());
			ocdParamCorrente.setIndReembolsoAdmin(chkIndReembolsoAdmin.isChecked());
			ocdParamCorrente.setIndtotalbilhete(chkIndtotalbilhete.isChecked());
			ocdParamCorrente.setIndsempregerarapagar(chkIndsempregerarapagar.isChecked());
			ocdParamCorrente.setIndEstornoPix(chkindEstornoPix.isChecked());
			if (ocdParamCorrente.getOcdparamId() == null){
				isSuscribir = true;
			}
			if(ocdParamService.suscribirActualizar(ocdParamCorrente) == null){
				Messagebox.show(
						Labels.getLabel("editarOCDParamController.MSG.empresaJaCadastrada"),
						Labels.getLabel("editarOCDParamController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			if (isSuscribir){
				ocdParamList.addItemNovo(ocdParamCorrente);
			} else {
				ocdParamList.updateItem(ocdParamCorrente);
			}
						
			Messagebox.show(
					Labels.getLabel("editarOCDParamController.MSG.suscribirOK"),
					Labels.getLabel("editarOCDParamController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();
			
		}catch (Exception ex) {
			log.error("editarOCDParamController: " + ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarOCDParamController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
		
	}
	
	public void onClick$btnAdicionarPtoVtaOCDParam(Event ev) {

		if (cmbPuntoVenta.getSelectedItem() != null) {

			PuntoVenta puntoVenta = (PuntoVenta) cmbPuntoVenta.getSelectedItem().getValue();

			OCDPtoVtaParam ocdPtoVtaParam = new OCDPtoVtaParam();
			ocdPtoVtaParam.setOcdParam(ocdParamCorrente);
			ocdPtoVtaParam.setPuntoventa(puntoVenta);

			ocdParamCorrente.addOCDPtoVtaParam(ocdPtoVtaParam);

			ptoVtaOCDParamList.setData(removerOCDPtoVtaParamInativo(ocdParamCorrente.getListOCDPtoVtaParam()));
		}

	}

	public void onClick$btnApagarPtoVtaOCDParam(Event ev) {
		try {
			if (ptoVtaOCDParamList.getSelected() != null) {
				int resp = Messagebox.show(
						Labels.getLabel("editarPuntoVentaController.MSG.borrarPtoVtaCheckin"),
						Labels.getLabel("editarPuntoVentaController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

				if (resp == Messagebox.YES) {

					OCDPtoVtaParam ocdPtoVtaParam = (OCDPtoVtaParam) ptoVtaOCDParamList.getSelected();
					if (ocdPtoVtaParam.getOcdPtoVtaParamId() != null) {
						ocdPtoVtaParamService.borrar(ocdPtoVtaParam);
					}
					ocdParamCorrente.removePtovtaOCDParam(ocdPtoVtaParam);
					ptoVtaOCDParamList.setData(removerOCDPtoVtaParamInativo(ocdParamCorrente.getListOCDPtoVtaParam()));
				}
			}
		} catch (Exception ex) {
			log.error(ex.toString());
		}
	}
	
	public void onClick$chkIndReembolsoAdmin(Event ev) throws InterruptedException {
		if(chkIndReembolsoAdmin.isChecked()) {
			chkindEstornoPix.setChecked(false);
		}		
	}
	
	public void onClick$chkindEstornoPix(Event ev) throws InterruptedException {
		if(chkindEstornoPix.isChecked()) {
			chkIndReembolsoAdmin.setChecked(false);
		}		
	}
	
	

	public Textbox getTxtDiasPagar() {
		return txtDiasPagar;
	}

	public void setTxtDiasPagar(Textbox txtDiasPagar) {
		this.txtDiasPagar = txtDiasPagar;
	}

	public Textbox getTxtPenalizacion() {
		return txtPenalizacion;
	}

	public void setTxtPenalizacion(Textbox txtPenalizacion) {
		this.txtPenalizacion = txtPenalizacion;
	}

	public OCDParam getOcdParamCorrente() {
		return ocdParamCorrente;
	}

	public void setOcdParamCorrente(OCDParam ocdParamCorrente) {
		this.ocdParamCorrente = ocdParamCorrente;
	}

	public Checkbox getChkOCDDefault() {
		return chkOCDDefault;
	}

	public void setChkOCDDefault(Checkbox chkOCDDefault) {
		this.chkOCDDefault = chkOCDDefault;
	}

	public Checkbox getChkOCDTroca() {
		return chkOCDTroca;
	}

	public void setChkOCDTroca(Checkbox chkOCDTroca) {
		this.chkOCDTroca = chkOCDTroca;
	}

	public Radio getRdPenalizacionOCD() {
		return rdPenalizacionOCD;
	}

	public void setRdPenalizacionOCD(Radio rdPenalizacionOCD) {
		this.rdPenalizacionOCD = rdPenalizacionOCD;
	}

	public Radio getRdPenalizacionOrgaoConcedente() {
		return rdPenalizacionOrgaoConcedente;
	}

	public void setRdPenalizacionOrgaoConcedente(Radio rdPenalizacionOrgaoConcedente) {
		this.rdPenalizacionOrgaoConcedente = rdPenalizacionOrgaoConcedente;
	}
	
	public Boolean isTempoLimitePenalizacaoOcd() {
		Constante constante = constanteService.buscarPorNomeConstante(Constantes.TEMPO_LIMITE_PEN_PARAM_OCD);
		if(constante != null) {
			return Boolean.valueOf(constante.getValorconstante());
		}
		return false;
	}

	public Textbox getTxtTiempoLimitePenalizacion() {
		return txtTiempoLimitePenalizacion;
	}

	public void setTxtTiempoLimitePenalizacion(Textbox txtTiempoLimitePenalizacion) {
		this.txtTiempoLimitePenalizacion = txtTiempoLimitePenalizacion;
	}

	/**
	 * @return the cmbPuntoVenta
	 */
	public MyComboboxPuntoVenta getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

	/**
	 * @param cmbPuntoVenta the cmbPuntoVenta to set
	 */
	public void setCmbPuntoVenta(MyComboboxPuntoVenta cmbPuntoVenta) {
		this.cmbPuntoVenta = cmbPuntoVenta;
	}

	/**
	 * @return the lsPuntoVenta
	 */
	public List<PuntoVenta> getLsPuntoVenta() {
		return lsPuntoVenta;
	}

	/**
	 * @param lsPuntoVenta the lsPuntoVenta to set
	 */
	public void setLsPuntoVenta(List<PuntoVenta> lsPuntoVenta) {
		this.lsPuntoVenta = lsPuntoVenta;
	}

	public Checkbox getChkIndsempregerarapagar() {
		return chkIndsempregerarapagar;
	}

	public void setChkIndsempregerarapagar(Checkbox chkIndsempregerarapagar) {
		this.chkIndsempregerarapagar = chkIndsempregerarapagar;
	}

	public Checkbox getChkindEstornoPix() {
		return chkindEstornoPix;
	}

	public void setChkindEstornoPix(Checkbox chkindEstornoPix) {
		this.chkindEstornoPix = chkindEstornoPix;
	}
	
	
	
}