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

import java.util.Date;
import java.util.HashMap;
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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.Caja;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.IntegracaoTotvsService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEmpresa;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCajaTotvs;

/**
 * 
 * @author valdevir.pinheiro
 */
@Controller("integracaoTotvsController")
@Scope("prototype")
public class BusquedaIntegracaoTotvsController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(BusquedaIntegracaoTotvsController.class);
	private List<Empresa> lsEmpresas;
	private Combobox cmbEmpresa;
	private Combobox cmbEmpresaServico;
	private Combobox cmbPuntoVenta;
	private Datebox fecInicioIntervalo;
	private Datebox fecFinIntervalo;
	private Datebox fecInicioCorrida;
	private Datebox fecFinCorrida;
	private Date dataDe;
	private Date dataAte;
	private Date dataInicioCorrida;
	private Date dataFimCorrida;
	private Date dataFimServico;
	private Integer numCorrida;
	private Integer numServico;
	private Intbox txtNumCorrida;
	private Intbox txtNumServico;
	private MyListbox cajaList;
	private Paging pagingCaja;
	@Autowired
	private transient PagedListWrapper<Caja> plwCaja;

	@Autowired
	private IntegracaoTotvsService integracaoTotvsService;

	public Datebox getFecInicioIntervalo() {
		return fecInicioIntervalo;
	}

	public void setFecInicioIntervalo(Datebox fecInicioIntervalo) {
		this.fecInicioIntervalo = fecInicioIntervalo;
	}

	public Datebox getFecFinIntervalo() {
		return fecFinIntervalo;
	}

	public void setFecFinIntervalo(Datebox fecFinIntervalo) {
		this.fecFinIntervalo = fecFinIntervalo;
	}

	public Date getDataDe() {
		return dataDe;
	}

	public void setDataDe(Date dataDe) {
		this.dataDe = dataDe;
	}

	public Date getDataAte() {
		return dataAte;
	}

	public void setDataAte(Date dataAte) {
		this.dataAte = dataAte;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		dataDe = new Date();
		dataAte = new Date();
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		
		cajaList.setItemRenderer(new RenderCajaTotvs());
		cajaList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				cajaList.getSelected();
				Caja caja = (Caja) cajaList.getSelected();
				Map args = new HashMap();
				args.put("caja", caja);
				openWindow("/gui/catalogos/editarIntegracaoTotvsBilhete.zul",
						Labels.getLabel("editarIntegracaoTotvsController.window.title"), args, MyGenericForwardComposer.MODAL);
			}
		});

		refreshLista();
	}

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

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

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

	private void refreshLista() {
		HibernateSearchObject<Caja> cajaBusqueda = new HibernateSearchObject<Caja>(Caja.class, pagingCaja.getPageSize());
		// Filtro erro na integração
		cajaBusqueda.addFilterIn("integradoTotvs", 2, 3 );
		// Filtro empresa
		Comboitem cbEmpresa = cmbEmpresa.getSelectedItem();
		if (cbEmpresa != null) {
			Empresa empresa = (Empresa) cbEmpresa.getValue();
			if (empresa != null) {
				cajaBusqueda.addFilterEqual("empresacorridaId", empresa.getEmpresaId());
			}
		}
		// Filtro Ponto de Venda
		Comboitem cbPuntoVenta = cmbPuntoVenta.getSelectedItem();
		if (cbPuntoVenta != null) {
			PuntoVenta puntoVenta = (PuntoVenta) cbPuntoVenta.getValue();
			if (puntoVenta != null) {
				cajaBusqueda.addFilterEqual("puntoventaId", puntoVenta.getPuntoventaId());
			}
		}
		Date valueFecInicio = fecInicioIntervalo.getValue();
		Date valueFecFin = fecFinIntervalo.getValue();
		
		valueFecInicio = valueFecInicio==null?new Date():valueFecInicio;
		valueFecFin = valueFecFin==null?new Date():valueFecFin;
		
		valueFecInicio = DateUtil.inicioFecha(valueFecInicio);
		valueFecFin = DateUtil.fimFecha(valueFecFin);
		
		// Filtro data
		cajaBusqueda.addFilterGreaterOrEqual("fechorventa", valueFecInicio);
		cajaBusqueda.addFilterLessOrEqual("fechorventa", valueFecFin);
		plwCaja.init(cajaBusqueda, cajaList, pagingCaja);
		if (cajaList.getData().length == 0) {
			try {
				org.zkoss.zul.Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("integracaoTotvsController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	public void onClick$btnSolicitarIntegracao(Event ev) throws Exception {
		dataDe = fecInicioIntervalo.getValue() != null ? DateUtil.inicioFecha(fecInicioIntervalo.getValue()) : null;
		dataAte = fecFinIntervalo.getValue() != null ? DateUtil.fimFecha(fecFinIntervalo.getValue()) : null;
		// Periodo não pode ser vazio.
		if (dataDe == null || dataAte == null) {
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("integracaoTotvsController.MSG.filtrovazio.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
			return;
		} else {
			Date dataAtual = new Date();
			if (DateUtil.compareOnlyDate(dataDe, dataAtual) >= 0 || DateUtil.compareOnlyDate(dataAte, dataAtual) >= 0) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("integracaoTotvsController.MSG.filtrodataatual.value"),
						Labels.getLabel("integracaoTotvsController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
				return;
			}
		}
		Empresa empresa = cmbEmpresa.getSelectedItem() != null ? (Empresa) cmbEmpresa.getSelectedItem().getValue() : null;
		PuntoVenta puntoVenta = cmbPuntoVenta.getSelectedItem() != null ? (PuntoVenta) cmbPuntoVenta.getSelectedItem().getValue() : null;
		if (puntoVenta == null) {
			Integer opcao = org.zkoss.zul.Messagebox.show(Labels.getLabel("integracaoTotvsController.MSG.filtropuntoventavazio.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.YES | org.zkoss.zul.Messagebox.NO, org.zkoss.zul.Messagebox.QUESTION);
			if (opcao.equals(org.zkoss.zul.Messagebox.NO)) {
				return;
			}
		}
		Integer retornoUpdate = null;
		Boolean isIntegrado = Boolean.FALSE;
		if (empresa == null) {
			for (Empresa empresaAux : lsEmpresas) {
				if (puntoVenta == null) {
					List<PuntoVenta> lsPuntoVentaAux = integracaoTotvsService.buscaPuntoVentaEmpresa(empresaAux);
					for (PuntoVenta puntoVentaAux : lsPuntoVentaAux) {
						retornoUpdate = integracaoTotvsService.solicitaReIntegracaoBilhete(empresaAux, dataDe, dataAte, puntoVentaAux, UsuarioLogado.getUsuarioLogado());
					}
				} else {
					retornoUpdate = integracaoTotvsService.solicitaReIntegracaoBilhete(empresaAux, dataDe, dataAte, puntoVenta, UsuarioLogado.getUsuarioLogado());
				}
				if (retornoUpdate > 0) {
					isIntegrado = Boolean.TRUE;
				}
			}
		} else {
			if (puntoVenta == null) {
				List<PuntoVenta> lsPuntoVentaAux = integracaoTotvsService.buscaPuntoVentaEmpresa(empresa);
				for (PuntoVenta puntoVentaAux : lsPuntoVentaAux) {
					retornoUpdate = integracaoTotvsService.solicitaReIntegracaoBilhete(empresa, dataDe, dataAte, puntoVentaAux, UsuarioLogado.getUsuarioLogado());
					if (retornoUpdate > 0) {
						isIntegrado = Boolean.TRUE;
					}
				}
			} else {
				retornoUpdate = integracaoTotvsService.solicitaReIntegracaoBilhete(empresa, dataDe, dataAte, puntoVenta, UsuarioLogado.getUsuarioLogado());
				if (retornoUpdate > 0) {
					isIntegrado = Boolean.TRUE;
				}
			}

		}
		if (isIntegrado) {
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("integracaoTotvsController.MSG.retornosucesso.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);
		} else {
			if (retornoUpdate.intValue() == 0) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("integracaoTotvsController.MSG.retornovazio.value"),
						Labels.getLabel("integracaoTotvsController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
			}
		}
	}

	public void onClick$btnSolicitarIntegracaoServico(Event ev) throws Exception {
		numServico = txtNumServico.getValue();
		if (numServico == null) {
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("integracaoTotvsController.MSG.filtrovazioNumServico.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
			return;
		}
		Empresa empresa = cmbEmpresaServico.getSelectedItem() != null ? (Empresa) cmbEmpresaServico.getSelectedItem().getValue() : null;
		Integer retornoUpdate = integracaoTotvsService.atualizaStstausServicosIntegrar(empresa, numServico);
		if (retornoUpdate.intValue() >= 1) {
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("integracaoTotvsController.MSG.retornosucessoServico.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);
		} else {
			if (retornoUpdate.intValue() == 0) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("integracaoTotvsController.MSG.retornovazioServico.value"),
						Labels.getLabel("integracaoTotvsController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
			}
		}

	}

	public void onClick$btnSolicitarIntegracaoCorrida(Event ev) throws Exception {
		numCorrida = txtNumCorrida.getValue();
		if (numCorrida == null) {
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("integracaoTotvsController.MSG.filtrovazioNumCorrida.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
			return;
		}
		dataInicioCorrida = fecInicioCorrida.getValue() != null ? DateUtil.inicioFecha(fecInicioCorrida.getValue()) : null;
		dataFimCorrida = fecFinCorrida.getValue() != null ? DateUtil.fimFecha(fecFinCorrida.getValue()) : null;
		// Periodo não pode ser vazio.
		if (dataInicioCorrida == null || dataFimCorrida == null) {
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("integracaoTotvsController.MSG.retornovazioCorrida.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
			return;
		}
		Empresa empresa = cmbEmpresaServico.getSelectedItem() != null ? (Empresa) cmbEmpresaServico.getSelectedItem().getValue() : null;
		Integer retornoUpdate = integracaoTotvsService.atualizaStstausCorridasIntegrar(empresa, numCorrida, dataInicioCorrida, dataFimCorrida);
		if (retornoUpdate.intValue() >= 1) {
			org.zkoss.zul.Messagebox.show(
					Labels.getLabel("integracaoTotvsController.MSG.retornosucessoCorrida.value"),
					Labels.getLabel("integracaoTotvsController.window.title"),
					org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.INFORMATION);
		} else {
			if (retornoUpdate.intValue() == 0) {
				org.zkoss.zul.Messagebox.show(
						Labels.getLabel("integracaoTotvsController.MSG.retornovazioCorrida.value"),
						Labels.getLabel("integracaoTotvsController.window.title"),
						org.zkoss.zul.Messagebox.OK, org.zkoss.zul.Messagebox.EXCLAMATION);
			}
		}


	}

	public void onClick$btnPesquisa(Event ev) throws InterruptedException {
		refreshLista();
	}

	public void onClick$btnRefresh(Event ev) {
		refreshLista();
	}

	public void setDataInicioCorrida(Date dataInicioCorrida) {
		this.dataInicioCorrida = dataInicioCorrida;
	}

	public Date getDataFimCorrida() {
		return dataFimCorrida;
	}

	public void setDataFimCorrida(Date dataFimCorrida) {
		this.dataFimCorrida = dataFimCorrida;
	}

	public Integer getNumCorrida() {
		return numCorrida;
	}

	public void setNumCorrida(Integer numCorrida) {
		this.numCorrida = numCorrida;
	}

	public Intbox getTxtNumCorrida() {
		return txtNumCorrida;
	}

	public void setTxtNumCorrida(Intbox txtNumCorrida) {
		this.txtNumCorrida = txtNumCorrida;
	}

	public Intbox getTxtNumServico() {
		return txtNumServico;
	}

	public void setTxtNumServico(Intbox txtNumServico) {
		this.txtNumServico = txtNumServico;
	}

	public Date getDataInicioCorrida() {
		return dataInicioCorrida;
	}

	public Date getDataFimServico() {
		return dataFimServico;
	}

	public void setDataFimServico(Date dataFimServico) {
		this.dataFimServico = dataFimServico;
	}

}
