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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

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.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioOCDNaoResgatadaEmpresa;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioOCDReembolsoPix;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.IndOrdenacion;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.trg.search.Filter;

@Controller("relatorioOCDController")
@Scope("prototype")
public class RelatorioOCDController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;

	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;
	private Datebox datInicial;
	private Datebox datFinal;
	private Datebox datPagoInicial;
	private Datebox datPagoFinal;
	private Radio radPendente;
	private Radio radPagos;
	private Radio radTodos;
	private Paging pagingPuntoVenta;
	private Textbox txtPalavraPesquisa;
	
	private Radio radBoleto;
	private Radio radNumOperacao;
	private Radio radFecInclusao;
	private Combobox cmbEmpresa;
	private List<Empresa> lsEmpresas;
	private MyTextbox txtNumOperacao;
	
	private IndOrdenacion ordenacion;
	
	private Checkbox chOcdReembolsoPix;
	private Row rowStatusOCD;

	private void executarRelatorio() throws Exception {

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("TITULO", Labels.getLabel("relatorioOCDController.window.title"));

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		if(datInicial.getValue() != null) {
			parametros.put("fecInicio", sdf.format(this.datInicial.getValue()));
		}
		if(datFinal.getValue() != null) {
			parametros.put("fecFinal", sdf.format(this.datFinal.getValue()));
		}
		if(datPagoInicial.getValue() != null) {
			parametros.put("fecPagoInicio", sdf.format(this.datPagoInicial.getValue()));
		}
		if(datPagoFinal.getValue() != null) {
			parametros.put("fecPagoFinal", sdf.format(this.datPagoFinal.getValue()));
		}
		parametros.put("statusPendente", radPendente.isChecked());
		parametros.put("statusPago", radPagos.isChecked());
		parametros.put("statusTodos", radTodos.isChecked());
		parametros.put("numOperacao", txtNumOperacao.getValue());
		
		if(radBoleto.isChecked()){
			ordenacion = IndOrdenacion.BOLETO;
		}else if(radNumOperacao.isChecked()){
			ordenacion = IndOrdenacion.NUM_OPERACION;
		}else if(radFecInclusao.isChecked()){
			ordenacion = IndOrdenacion.FECHA_CREACION;
		}else{
			ordenacion = IndOrdenacion.FECHA_PAGAMENTO;
		}
		
		parametros.put("ordenacion",ordenacion);
		
		StringBuilder filtro = new StringBuilder();
		filtro.append("Agência(s): ");
		if (puntoVentaSelList.getListData().size() > 0) {
			List<PuntoVenta> puntoVentas = new ArrayList<PuntoVenta>();
			for (Object obj : puntoVentaSelList.getListData()) {
				puntoVentas.add((PuntoVenta) obj);
			}
			parametros.put("puntoventas", puntoVentas);
			parametros.put("isnumpuntoventatodos", "N");
			filtro.append(puntoVentaSelList.getListData().size() + " selecionada(s);");
		} else {
			parametros.put("isnumpuntoventatodos", "S");
			filtro.append("Todas");
		}

		filtro.append("; Empresa: ");
		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			parametros.put("empresa", empresa.getEmpresaId());
			filtro.append(empresa.getNombempresa());
		} else {
			filtro.append("Todos; ");
		}
		
		parametros.put("usuario", UsuarioLogado.getUsuarioLogado().getClaveUsuario());
		parametros.put("filtros", filtro.toString());
		Relatorio relatorio =null;
		if(chOcdReembolsoPix.isChecked()) {
			 relatorio = new RelatorioOCDReembolsoPix(parametros, dataSourceRead.getConnection());

		}else {
		 relatorio = new RelatorioOCDNaoResgatadaEmpresa(parametros, dataSourceRead.getConnection());
		}
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul",
				Labels.getLabel("relatorioOCDController.window.title"), args, MODAL);

	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		if(this.datInicial.getValue() == null &&
		   this.datFinal.getValue() == null &&
		   this.datPagoInicial.getValue() == null &&
		   this.datPagoFinal.getValue() == null) {
			Messagebox.show(Labels.getLabel("relatorioOCDController.msg.nenhumaDataInformada"),
					Labels.getLabel("relatorioOCDController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}

		if(!validarDatas(this.datInicial.getValue(), this.datFinal.getValue())) {
			Messagebox.show(Labels.getLabel("relatorioOCDController.msg.dataInicialFinal"),
					Labels.getLabel("relatorioOCDController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		
		if(!validarDatas(this.datPagoInicial.getValue(), this.datPagoFinal.getValue())) {
			Messagebox.show(Labels.getLabel("relatorioOCDController.msg.dataInicialFinal"),
					Labels.getLabel("relatorioOCDController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		
		executarRelatorio();
	}
	
	public void onClick$chOcdReembolsoPix(Event ev) throws Exception {
		if(chOcdReembolsoPix.isChecked()) {
			rowStatusOCD.setVisible(false);
		}else {
			rowStatusOCD.setVisible(true);
		}
	}
	

	private boolean validarDatas(Date dataInicial, Date dataFinal) {
		boolean isDataInicial = dataInicial != null;
		boolean isDataFinal = dataFinal != null;
		if(isDataInicial && isDataFinal) {
			return true;
		}
		if(!isDataInicial && !isDataFinal) {
			return true;
		}
		return false;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
	}

	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;
	}

	public MyTextbox getTxtNumOperacao() {
		return txtNumOperacao;
	}

	public void setTxtNumOperacao(MyTextbox txtNumOperacao) {
		this.txtNumOperacao = txtNumOperacao;
	}
	
	public void onClick$btnLimpar(Event ev) {
		limparPesquisaAgencia();
	}

	public void onClick$btnPesquisa(Event ev) {
		executarPesquisa();
	}
	
	private void limparPesquisaAgencia() {
		puntoVentaSelList.setData(new ArrayList<Object>());

	}
	
	public void onDoubleClick$puntoVentaList(Event ev) {
		PuntoVenta puntoVentaSel = (PuntoVenta) puntoVentaList.getSelected();
		puntoVentaSelList.addItemNovo(puntoVentaSel);
	}

	public void onDoubleClick$puntoVentaSelList(Event ev) {
		PuntoVenta puntoVentaSel = (PuntoVenta) puntoVentaSelList.getSelected();
		puntoVentaSelList.removeItem(puntoVentaSel);
	}
	
	private void executarPesquisa() {
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda = new HibernateSearchObject<PuntoVenta>(PuntoVenta.class,
				pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterOr(Filter.like("nombpuntoventa", "%" + txtPalavraPesquisa.getText().trim().toUpperCase().concat("%")), Filter.like("numPuntoVenta", "%" + txtPalavraPesquisa.getText().trim().toUpperCase().concat("%")));

		puntoVentaBusqueda.addSortAsc("nombpuntoventa");

		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta);

		if (puntoVentaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioDevolucaoBilhetesController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

}
