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

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

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDiferencasTransferencias;
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.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPuntoVentaSimple;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioGenericoEmpresasSel;
import com.trg.search.Filter;

@Controller("relatorioDiferencasTransferenciasController")
@Scope("prototype")
public class RelatorioDiferencasTransferenciasController extends MyGenericForwardComposer {

	private static final String LIKE = "%";

	private static final long serialVersionUID = 1L;

	private Datebox datInicial;
	private Datebox datFinal;
	private Textbox txtNombreEmpresa;
	private Paging pagingEmpresa;
	private Paging pagingEmpresaSel;
	private MyListbox empresaList;	
	private MyListbox empresaSelList;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelectedList;
	private Textbox txtNomeAgencia;
	private Paging pagingPuntoVenta;

	@Autowired
	private DataSource dataSourceRead;	
	
	@Autowired
	private transient PagedListWrapper<Empresa> plwEmpresa;
	
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		empresaList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel());
		empresaSelList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel());
		puntoVentaList.setItemRenderer(new RenderPuntoVentaSimple());
		puntoVentaSelectedList.setItemRenderer(new RenderPuntoVentaSimple());
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}
	
	public void onClick$btnPesquisaEmpresa(Event ev) {
		HibernateSearchObject<Empresa> empresaBusqueda =
				new HibernateSearchObject<Empresa>(Empresa.class, pagingEmpresa.getPageSize());

		empresaBusqueda.addFilterILike("nombempresa", obtemFiltroLike(txtNombreEmpresa));
		empresaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		empresaBusqueda.addSortAsc("nombempresa");

		plwEmpresa.init(empresaBusqueda, empresaList, pagingEmpresa);

		validaPesquisaSemRegistro(empresaList);
	}
	
	public void onClick$btnLimparEmpresa(Event ev) {
		empresaList.setData(new ArrayList<Empresa>());
		txtNombreEmpresa.setText("");
	}
	
	public void onDoubleClick$empresaList(Event ev) {
		Empresa empresa = (Empresa) empresaList.getSelected();
		if (empresa!= null && 
				!Arrays.asList(empresaSelList.getData()).contains(empresa)) {
			empresaSelList.addItemNovo(empresa);
		}
	}
	
	public void onDoubleClick$empresaSelList(Event ev) {
		Empresa empresa = (Empresa) empresaSelList.getSelected();
		empresaSelList.removeItem(empresa);
	}
	
	public void onClick$btnPesquisaAgencia(Event ev) {
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda = 
				new HibernateSearchObject<PuntoVenta>(PuntoVenta.class, pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterOr(Filter.like("nombpuntoventa", obtemFiltroLike(txtNomeAgencia)), 
				Filter.like("numPuntoVenta", obtemFiltroLike(txtNomeAgencia)));
		puntoVentaBusqueda.addSortAsc("nombpuntoventa");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta);

		validaPesquisaSemRegistro(puntoVentaList);

	}
	
	public void onClick$btnLimparAgencia(Event ev) {
		puntoVentaList.setData(new ArrayList<Empresa>());
		txtNomeAgencia.setText("");
	}
	
	public void onDoubleClick$puntoVentaList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaList.getSelected();
		if (puntoVenta != null
				&& !Arrays.asList(puntoVentaSelectedList.getData()).contains(puntoVenta)) {
			puntoVentaSelectedList.addItemNovo(puntoVenta);
		}
	}

	public void onDoubleClick$puntoVentaSelectedList(Event ev) {
		PuntoVenta puntoVentaSel = (PuntoVenta) puntoVentaSelectedList.getSelected();
		puntoVentaSelectedList.removeItem(puntoVentaSel);
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		if (!isPeriodoValido()) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioDiferencasTransferenciasController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		} else {
			Relatorio relatorio;

			Map<String, Object> parametros = new HashMap<String, Object>();
			StringBuilder filtro = new StringBuilder();

			parametros.put("DATA_INICIAL", (java.util.Date) datInicial.getValue());
			parametros.put("DATA_FINAL", (java.util.Date) datFinal.getValue());
			
			List<Empresa> listaEmpresa = (List<Empresa>)(Object)Arrays.asList(empresaSelList.getData());
			if (!listaEmpresa.isEmpty()) {
				parametros.put("EMPRESA_ID", getIdsEmpresa(listaEmpresa));
			}
			
			List<PuntoVenta> listaPontosVenda = (List<PuntoVenta>)(Object)Arrays.asList(puntoVentaSelectedList.getData());
			if (!listaPontosVenda.isEmpty()) {
				parametros.put("PUNTOVENTA_ID", getIdsPontoVenda(listaPontosVenda));
				configuraFiltroAgencia(filtro, listaPontosVenda);
			} else {
				filtro.append(" Agências: TODAS");
			}

			parametros.put("FILTROS", filtro.toString());

			parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioDiferencasTransferenciasController.window.title"));
			parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario());

			relatorio = new RelatorioDiferencasTransferencias(parametros, dataSourceRead.getConnection());

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

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

	private void configuraFiltroAgencia(StringBuilder filtro, List<PuntoVenta> lista) {
		filtro.append(" Agências: ");
		for (PuntoVenta pontoVenda : lista) {
			filtro.append(pontoVenda.getNombpuntoventa());
			filtro.append(", ");
		}
		filtro.delete(filtro.length()-2, filtro.length());
	}

	private String getIdsEmpresa(List<Empresa> lista) {
		String ids = "";
		for (Empresa empresa : lista) {
			ids += empresa.getEmpresaId() +", ";
		}
		return ids.substring(0, ids.length()-2);
	}

	private String getIdsPontoVenda(List<PuntoVenta> lista) {
		StringBuilder ids = new StringBuilder();
		for (PuntoVenta pontoVenda : lista) {
			ids.append(pontoVenda.getPuntoventaId());
			ids.append(", ");
		}
		return ids.substring(0, ids.length()-2);
	}

	private boolean isPeriodoValido() {
		return datFinal.getValue().compareTo(datInicial.getValue()) >= 0;
	}

	private void validaPesquisaSemRegistro(MyListbox listBox) {
		if (listBox.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioDiferencasTransferenciasController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}
	
	private String obtemFiltroLike(Textbox filtro) {
		return LIKE.concat(filtro.getText().trim().toUpperCase().concat(LIKE)) ;
	}
	
	public Datebox getDatInicial() {
		return datInicial;
	}

	public void setDatInicial(Datebox datInicial) {
		this.datInicial = datInicial;
	}

	public Textbox getTxtNombreEmpresa() {
		return txtNombreEmpresa;
	}

	public void setTxtNombreEmpresa(Textbox txtNombreEmpresa) {
		this.txtNombreEmpresa = txtNombreEmpresa;
	}

	public Paging getPagingEmpresa() {
		return pagingEmpresa;
	}

	public void setPagingEmpresa(Paging pagingEmpresa) {
		this.pagingEmpresa = pagingEmpresa;
	}

	public Paging getPagingEmpresaSel() {
		return pagingEmpresaSel;
	}

	public void setPagingEmpresaSel(Paging pagingEmpresaSel) {
		this.pagingEmpresaSel = pagingEmpresaSel;
	}

	public MyListbox getEmpresaList() {
		return empresaList;
	}

	public void setEmpresaList(MyListbox empresaList) {
		this.empresaList = empresaList;
	}

	public MyListbox getEmpresaSelList() {
		return empresaSelList;
	}

	public void setEmpresaSelList(MyListbox empresaSelList) {
		this.empresaSelList = empresaSelList;
	}

	public Datebox getDatFinal() {
		return datFinal;
	}

	public void setDatFinal(Datebox datFinal) {
		this.datFinal = datFinal;
	}

	public MyListbox getPuntoVentaList() {
		return puntoVentaList;
	}

	public void setPuntoVentaList(MyListbox puntoVentaList) {
		this.puntoVentaList = puntoVentaList;
	}

	public MyListbox getPuntoVentaSelectedList() {
		return puntoVentaSelectedList;
	}

	public void setPuntoVentaSelectedList(MyListbox puntoVentaSelectedList) {
		this.puntoVentaSelectedList = puntoVentaSelectedList;
	}
	
}
