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.Comboitem;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radiogroup;

import com.rjconsultores.ventaboletos.dao.hibernate.ClienteDescuentoHibernateDAO;
import com.rjconsultores.ventaboletos.dao.hibernate.ClienteDireccionHibernateDAO;
import com.rjconsultores.ventaboletos.entidad.Cliente;
import com.rjconsultores.ventaboletos.entidad.ClienteDescuento;
import com.rjconsultores.ventaboletos.entidad.ClienteDireccion;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioCarteirinha;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
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.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderClienteCarteirinha;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderClienteCarteirinhaSel;
import com.trg.search.Filter;

@Controller("relatorioCarterinhaController")
@Scope("prototype")
public class RelatorioCarteirinhaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
	private Radiogroup rgLayout;

	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private DataSource dataSourceRead;	
	
	@Autowired
	private transient PagedListWrapper<Cliente> plwCliente;	
	@Autowired
	private ClienteDireccionHibernateDAO clienteDireccionHibernateDAO;
	
	@Autowired
	private ClienteDescuentoHibernateDAO clienteDescuentoHibernateDAO;
		
	private MyTextbox txtCliente;
	
	private Paging pagingCliente;
	
	private MyListbox clienteList;	
	
	private MyListbox clienteSelList;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();		
		super.doAfterCompose(comp);		
		clienteList.setItemRenderer(new RenderClienteCarteirinha());
		clienteSelList.setItemRenderer(new RenderClienteCarteirinhaSel());
	}

	/**
	 * @throws Exception
	 * 
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		
		List<Cliente> lsClienteSelecionados = new ArrayList(Arrays.asList(clienteSelList.getData()));
		
		Map<String, Object> parametros = new HashMap<String, Object>();
		Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		parametros.put("EMPRESA_ID", empresa.getEmpresaId());
		RelatorioCarteirinha.TipoLayout tipoLayout = RelatorioCarteirinha.TipoLayout.valueOf(rgLayout.getSelectedItem().getValue());
		Relatorio relatorio = new RelatorioCarteirinha(parametros, lsClienteSelecionados, tipoLayout, dataSourceRead.getConnection());
		
		Map args = new HashMap();
		args.put("relatorio", relatorio);
		openWindow("/component/reportView.zul",
				Labels.getLabel("carteirinhaController.window.title"), args, MODAL);
		
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		
		if(clienteSelList.getData().length == 0){
			Messagebox.show(Labels.getLabel("relatorioCarterinhaController.selecao.cliente"), Labels.getLabel("carteirinhaController.window.title"), 
					  Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		executarRelatorio();
		
	}
	
	private void executarPesquisaCliente() {
		HibernateSearchObject<Cliente> clienteBusqueda =
				new HibernateSearchObject<Cliente>(Cliente.class, pagingCliente.getPageSize());
		if(txtCliente.getValue() != null && !txtCliente.getValue().equals("") && cmbEmpresa.getSelectedItem() !=null){
			Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			clienteBusqueda.addFilterILike("nombcliente", txtCliente.getValue() + "%");
			clienteBusqueda.addFilterEqual("activo", Boolean.TRUE);
			clienteBusqueda.addSortAsc("nombcliente");
			// Mantis: 18276 - addFilterAll estava criando um NOT EXISTS
			// and  not (exists (select listclient1_.CLIENTEFIDELIDAD_ID from CLIENTE_FIDELIDAD listclient1_ where cliente0_.CLIENTE_ID=listclient1_.CLIENTE_ID and ( listclient1_.activo=1) and listclient1_.EMPRESA_ID=10))
			// clienteBusqueda.addFilterAll("listClienteFidelidad", Filter.equal("empresa.empresaId", empresa.getEmpresaId()));
			clienteBusqueda.addFilterIn("listClienteFidelidad.empresa.empresaId", Arrays.asList(empresa.getEmpresaId()));
		}						
		plwCliente.init(clienteBusqueda, clienteList, pagingCliente);		
		if (clienteList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
					  Labels.getLabel("carteirinhaController.window.title"), 
					  Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}


	public void onClick$btnPesquisa(Event ev) {
		executarPesquisaCliente();
	}
	
	public void onChange$cmbEmpresa(Event ev) {
		clienteSelList.setData(new ArrayList<Cliente>());
		clienteList.setData(new ArrayList<Cliente>());
	}
	
	public void onClick$btnLimpar(Event ev) {
		clienteList.setData(new ArrayList<Cliente>());
	
	}
	
	public void onDoubleClick$clienteList(Event ev) {
		Cliente cliente = (Cliente) clienteList.getSelected();		
		List<ClienteDireccion> clienteDireccions = clienteDireccionHibernateDAO.buscar(cliente);
		List<ClienteDescuento> clienteDescuento =  clienteDescuentoHibernateDAO.buscar(cliente);
		cliente.setLsClienteDireccion(clienteDireccions);
		cliente.setLsClienteDescuento(clienteDescuento);
		clienteSelList.addItemNovo(cliente);
	}
	
	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

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

	public Paging getPagingCliente() {
		return pagingCliente;
	}

	public void setPagingCliente(Paging pagingCliente) {
		this.pagingCliente = pagingCliente;
	}	
	
}
