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

import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
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.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasComissao;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasComissaoEstavel;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
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;

@Controller("relatorioVendasComissaoController")
@Scope("prototype")
public class RelatorioVendasComissaoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private DataSource dataSourceRead;
	
	@Autowired
	private EmpresaService empresaService;
	
	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
	
	private Datebox dataInicial;
	private Datebox dataFinal;
	private Checkbox chkApenasCancelados;
	
	private MyTextbox txtNombrePuntoVenta;
	private Paging pagingPuntoVenta;
	private MyListbox puntoVentaList;	
	private MyListbox puntoVentaSelList;
	
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		setLsEmpresa(empresaService.obtenerTodos());
		super.doAfterCompose(comp);
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		excutarRelatorios(false);
	}

	public void onClick$btnExecutarRelatorioEstavel(Event ev) throws Exception {
		excutarRelatorios(true);
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void excutarRelatorios(boolean versionestable) throws SQLException, Exception {

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date dataDe = dataInicial.getValue();
		Date dataAte = dataFinal.getValue();

		Timestamp fecVentaInicial = new Timestamp(DateUtil.inicioFecha(dataDe).getTime());
		Timestamp fecVentaFinal = new Timestamp(DateUtil.fimFecha(dataAte).getTime());

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("fecInicio", sdf.format(dataDe));
		parametros.put("fecFinal", sdf.format(dataAte));

		parametros.put("dataFiltroInicial", fecVentaInicial);
		parametros.put("dataFiltroFinal", fecVentaFinal);

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			parametros.put("EMPRESA_ID", empresa.getEmpresaId());
			parametros.put("empresa", empresa.getNombempresa());
		} else {
			parametros.put("empresa", "Todas;");
		}

		parametros.put("apenasCancelados", chkApenasCancelados.isChecked());

		List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData()));
		parametros.put("lsPuntoVenta", lsPuntoVentaSelecionados);

		Map<String, Object> args = new HashMap<String, Object>();
		if (versionestable) {
			Relatorio relatorio = new RelatorioVendasComissaoEstavel(parametros, dataSourceRead.getConnection());
			args.put("relatorio", relatorio);
		} else {
			Relatorio relatorio = new RelatorioVendasComissao(parametros, dataSourceRead.getConnection());
			args.put("relatorio", relatorio);
		}

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

	}
	
	public void onClick$btnPesquisa(Event ev) {
		
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda =
				new HibernateSearchObject<PuntoVenta>(PuntoVenta.class, pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterILike("nombpuntoventa", "%" + txtNombrePuntoVenta.getValue() + "%");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		puntoVentaBusqueda.addSortAsc("nombpuntoventa");

		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		
		puntoVentaBusqueda.addFilterNotEqual("puntoventaId", -1);

		plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta);

		if (puntoVentaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioVendasBilheteiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
		
	}
	
	public void onClick$btnLimpar(Event ev) {
		puntoVentaList.setData(new ArrayList<PuntoVenta>());
		txtNombrePuntoVenta.setText("");
	}
	
	public void onDoubleClick$puntoVentaSelList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaSelList.getSelected();
		puntoVentaSelList.removeItem(puntoVenta);
	}

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

	/**
	 * @return the lsEmpresa
	 */
	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	/**
	 * @param lsEmpresa the lsEmpresa to set
	 */
	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}
	
}
