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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

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.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioFinanceiroAnalitico;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioFinanceiroSintetico;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
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.RenderEstadoUf;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPuntoVentaSimple;
import com.trg.search.Filter;

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

	private static Logger log = LogManager.getLogger(BusquedaRelatorioFinanceiroController.class);

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private EstadoService estadoService;

	@Autowired
	private TipoPuntoVentaService tipoPuntoVentaService;

	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;

	private List<Empresa> lsEmpresa;
	private List<Estado> lsEstado;

	private Datebox datInicial;
	private Datebox datFinal;

	private MyComboboxEstandar cmbEmpresa;

	private List<TipoPuntoVenta> lsTipoPuntoVenta;
	private Combobox cmbTipoPuntoVenta;

	private MyListbox estadoList;
	private MyListbox puntoVentaList;

	private Textbox txtPalavraPesquisa;
	private MyListbox puntoVentaSelList;
	private Paging pagingPuntoVenta;
	
	private boolean isBpe;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		lsEstado = estadoService.obtenerTodos();
		lsTipoPuntoVenta = tipoPuntoVentaService.obtenerTodos();

		super.doAfterCompose(comp);

		estadoList.setItemRenderer(new RenderEstadoUf());
		estadoList.setData(lsEstado);
		puntoVentaList.setItemRenderer(new RenderPuntoVentaSimple());
		puntoVentaSelList.setItemRenderer(new RenderPuntoVentaSimple());
		
		isBpe = Executions.getCurrent().getArg().get("isRelatorioFinanceiroBpe") == null ? Boolean.FALSE : (Boolean) Executions.getCurrent().getArg().get("isRelatorioFinanceiroBpe");
		
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executar(boolean isSintetico, boolean isAnalitico) throws InterruptedException {

		try {
			Empresa empresa = cmbEmpresa == null ? null : (cmbEmpresa.getSelectedItem() == null ? null : (Empresa) cmbEmpresa.getSelectedItem().getValue());
			TipoPuntoVenta tipoPuntoVenta = cmbTipoPuntoVenta == null ? null : (cmbTipoPuntoVenta.getSelectedItem() == null ? null : (TipoPuntoVenta) cmbTipoPuntoVenta.getSelectedItem().getValue());
			List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData()));
			Map<String, Object> parametros = new HashMap<String, Object>();

			List<Estado> estados = new ArrayList<Estado>();
			for (Object ob : estadoList.getSelectedItemsByIndex()) {
				estados.add((Estado) ob);
			}
			
			StringBuilder filtro = new StringBuilder();

			filtro.append("Agência: ");
			String puntoVentaIds = "";
			String puntoVentas = "";
			if (lsPuntoVentaSelecionados.isEmpty()) {
				puntoVentas = "Todas";
			} else {
				for (int i = 0; i < lsPuntoVentaSelecionados.size(); i++) {
					PuntoVenta puntoVenta = lsPuntoVentaSelecionados.get(i);
					puntoVentas = puntoVentas + puntoVenta.getNombpuntoventa() + ",";

					puntoVentaIds = puntoVentaIds + puntoVenta.getPuntoventaId() + ",";
				}

				// removendo ultima virgula
				puntoVentaIds = puntoVentaIds.substring(0, puntoVentaIds.length() - 1);
				puntoVentas = puntoVentas.substring(0, puntoVentas.length() - 1);
				parametros.put("agencias", puntoVentaIds);
			}
			filtro.append(puntoVentas).append(";");
			
			
			parametros.put("isBpe", isBpe);
			parametros.put("empresa", empresa);
			parametros.put("nombempresa", empresa.getNombempresa());
			parametros.put("tipoPuntoVenta", tipoPuntoVenta);
			
			parametros.put("estados", estados);
			parametros.put("inicio", datInicial.getValue());
			parametros.put("fim", datFinal.getValue());
			parametros.put("usuario", UsuarioLogado.getUsuarioLogado().getClaveUsuario());
			parametros.put("FILTROS", filtro.toString());

			Relatorio relatorio = null;
			if (isSintetico)
				relatorio = new RelatorioFinanceiroSintetico(parametros, dataSourceRead.getConnection());
			else
				relatorio = new RelatorioFinanceiroAnalitico(parametros, dataSourceRead.getConnection());

			Map args = new HashMap();
			args.put("relatorio", relatorio);

			openWindow("/component/reportView.zul",
					Labels.getLabel("indexController.mnRelatoriosFinanceiros.label"), args, MODAL);

		} catch (Exception e) {
			log.error("", e);
			Messagebox.show(e.getMessage(),
					Labels.getLabel("indexController.mnImpressaoRMD.label"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}

	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("relatorioReceitaDiariaAgenciaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	public void onClick$btnLimparPtv(Event ev) {
		limparPesquisaAgencia();
	}

	private void limparPesquisaAgencia() {
		puntoVentaSelList.setData(new ArrayList<Object>());
	}

	public void onClick$btnPesquisaPtv(Event ev) {
		executarPesquisa();
	}

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

	public void onClick$btnSintetico(Event ev) throws InterruptedException {
		executar(true, false);
	}

	public void onClick$btnAnalitico(Event ev) throws InterruptedException {
		executar(false, true);
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public List<Estado> getLsEstado() {
		return lsEstado;
	}

	public List<TipoPuntoVenta> getLsTipoPuntoVenta() {
		return lsTipoPuntoVenta;
	}

	public MyListbox getPuntoVentaSelList() {
		return puntoVentaSelList;
	}
}
