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

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDescontos;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDescontosTipo2;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
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.RenderRelatorioGenericoEmpresasSel;

@Controller("relatorioDescontosController")
@Scope("prototype")
public class RelatorioDescontosController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;
	
	@Autowired
	private DataSource dataSourceRead;	
	
	@Autowired
	private transient PagedListWrapper<Empresa> plwEmpresa;
	
	@Autowired
	private TipoPuntoVentaService tipoPuntoVentaService;
	
	private MyComboboxPuntoVenta cmbAgencia;
	private Datebox fecVentaInicial;
	private Datebox fecVentaFinal;
	private Textbox txtCodConvenio;
	private Textbox txtNombreEmpresa;
	private Paging pagingEmpresa;
	private Paging pagingEmpresaSel;
	private MyListbox empresaList;	
	private MyListbox empresaSelList;
	private Combobox cmbTipoPontoVenta;
	private List<TipoPuntoVenta> lsTipoPuntoVenta;
	private Radiogroup rdbGroup;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);		
		empresaList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel());
		empresaSelList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel());
		lsTipoPuntoVenta = tipoPuntoVentaService.obtenerTodos();
	}
	
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		validarAntesImpressao();		
	}
	
	private void validarAntesImpressao() throws Exception {
		
		if(fecVentaInicial.getValue() == null) {
            Messagebox.show(
                    Labels.getLabel("relatorioDescontosController.info.fecVentaInicial"),
                    Labels.getLabel("relatorioDescontosController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);
            return;
		}
		
		if(fecVentaFinal.getValue() == null) {
            Messagebox.show(
                    Labels.getLabel("relatorioDescontosController.info.fecVentaFinal"),
                    Labels.getLabel("relatorioDescontosController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);
            return;
		}
		
		executarRelatorio();
	}

	@SuppressWarnings({ "rawtypes", "unchecked"})
	private void executarRelatorio() throws Exception {
		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("fecVentaInicial", fecVentaInicial.getValue());
		parametros.put("fecVentaFinal", fecVentaFinal.getValue());
		parametros.put("codconvenio", txtCodConvenio.getValue());
		parametros.put("usuario", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString() + " - " + UsuarioLogado.getUsuarioLogado().getNombusuario());
		parametros.put("nomeRelatorio", Labels.getLabel("relatorioDescontosController.window.title"));
		
		if (cmbAgencia.getSelectedIndex() != -1) {
			
			PuntoVenta puntoVenta = (PuntoVenta) cmbAgencia.getSelectedItem().getValue();
			parametros.put("idPuntoVenta", puntoVenta.getPuntoventaId());
			parametros.put("puntoVenta", puntoVenta.getPuntoventaId() + " - " + puntoVenta.getNombpuntoventa());
		}
		
		StringBuilder empresaIds = new StringBuilder();
		List<Empresa> lsEmpresasSelecionadas = new ArrayList(Arrays.asList(empresaSelList.getData()));
		for (int i = 0; i < lsEmpresasSelecionadas.size(); i++) {
			Empresa empresa = lsEmpresasSelecionadas.get(i);			
			if(empresaIds.length() > 0) {
				empresaIds.append(",");
			}
			empresaIds.append(empresa.getEmpresaId());
		}		
		parametros.put("EMPRESAIDS", empresaIds.toString());
		
		Comboitem itemTipoPontoVenta = cmbTipoPontoVenta.getSelectedItem();
		
		if (itemTipoPontoVenta != null) {
			TipoPuntoVenta tipoPontoVenta = (TipoPuntoVenta) itemTipoPontoVenta.getValue();
			parametros.put("tipoPuntoVenta", tipoPontoVenta == null ? null : tipoPontoVenta.getTipoptovtaId().intValue());
		} 
		
		Relatorio relatorio;
		if(rdbGroup.getSelectedItem().getValue().equals("1")) {
			relatorio = new RelatorioDescontos(parametros, dataSourceRead.getConnection());
		} else {
			relatorio = new RelatorioDescontosTipo2(parametros, dataSourceRead.getConnection());
		}
		
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul", Labels.getLabel("relatorioDescontosController.window.title"), args, MODAL);		
		
	}
	
	private void executarPesquisa() {
		HibernateSearchObject<Empresa> empresaBusqueda =
				new HibernateSearchObject<Empresa>(Empresa.class, pagingEmpresa.getPageSize());

		empresaBusqueda.addFilterILike("nombempresa", "%" + txtNombreEmpresa.getValue() + "%");
		empresaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		empresaBusqueda.addSortAsc("nombempresa");

		plwEmpresa.init(empresaBusqueda, empresaList, pagingEmpresa);

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

	public void onClick$btnPesquisa(Event ev) {
		executarPesquisa();
	}
	
	public void onClick$btnLimpar(Event ev) {
		empresaList.setData(new ArrayList<Empresa>());
		txtNombreEmpresa.setText("");
	}
	
	public void onDoubleClick$empresaList(Event ev) {
		Empresa empresa = (Empresa) empresaList.getSelected();
		empresaSelList.addItemNovo(empresa);
	}
	
	public void onDoubleClick$empresaSelList(Event ev) {
		Empresa empresa = (Empresa) empresaSelList.getSelected();
		empresaSelList.removeItem(empresa);
	}
	
	public MyComboboxPuntoVenta getCmbAgencia() {
		return cmbAgencia;
	}
	
	public void setCmbAgencia(MyComboboxPuntoVenta cmbAgencia) {
		this.cmbAgencia = cmbAgencia;
	}
	public Datebox getFecVentaInicial() {
		return fecVentaInicial;
	}
	public void setFecVentaInicial(Datebox fecVentaInicial) {
		this.fecVentaInicial = fecVentaInicial;
	}
	public Datebox getFecVentaFinal() {
		return fecVentaFinal;
	}
	public void setFecVentaFinal(Datebox fecVentaFinal) {
		this.fecVentaFinal = fecVentaFinal;
	}
	public Textbox getTxtCodConvenio() {
		return txtCodConvenio;
	}
	public void setTxtCodConvenio(Textbox txtCodConvenio) {
		this.txtCodConvenio = txtCodConvenio;
	}
	public Textbox getTxtNombreEmpresa() {
		return txtNombreEmpresa;
	}
	public void setTxtNombreEmpresa(Textbox txtNombreEmpresa) {
		this.txtNombreEmpresa = txtNombreEmpresa;
	}

	public PagedListWrapper<Empresa> getPlwEmpresa() {
		return plwEmpresa;
	}

	public void setPlwEmpresa(PagedListWrapper<Empresa> plwEmpresa) {
		this.plwEmpresa = plwEmpresa;
	}

	public Paging getPagingEmpresa() {
		return pagingEmpresa;
	}

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

	public MyListbox getPuntoVentaList() {
		return empresaList;
	}

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

	public MyListbox getEmpresaSelList() {
		return empresaSelList;
	}

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

	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 Combobox getCmbTipoPontoVenta() {
		return cmbTipoPontoVenta;
	}

	public void setCmbTipoPontoVenta(Combobox cmbTipoPontoVenta) {
		this.cmbTipoPontoVenta = cmbTipoPontoVenta;
	}

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

	public void setLsTipoPuntoVenta(List<TipoPuntoVenta> lsTipoPuntoVenta) {
		this.lsTipoPuntoVenta = lsTipoPuntoVenta;
	}
}