/**
 *
 */
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
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 com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.FormaPago;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.FormaPagoService;
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.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiro;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioVendasBilheteiroSelecionados;

/**
 * @author Thiago
 *
 */
@Controller("relatorioEstornoCartaoController")
@Scope("prototype")
public class RelatorioEstornoCartaoController extends MyGenericForwardComposer {

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;

	private Datebox datInicial;
	private Datebox datFinal;
	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
	private Paging pagingPuntoVenta;
	private MyTextbox txtCpf;
	private MyTextbox txtCartao;
	private MyTextbox txtNombrePuntoVenta;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;
	
	private Combobox cmbFormaPago;	
	private List<FormaPago> lsFormaPago;
	
	@Autowired
	private FormaPagoService formaPagoService;
	
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		
		lsFormaPago = formaPagoService.obtenerTodos();
		
		super.doAfterCompose(comp);
		puntoVentaList.setItemRenderer(new RenderRelatorioVendasBilheteiro());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioVendasBilheteiroSelecionados());
	}

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

	/**
	 * @throws Exception
	 *
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executarRelatorio() throws Exception {
		{
			if (datInicial != null && datFinal != null && datFinal.getValue().compareTo(datInicial.getValue()) < 0) {
				try {
					Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
							Labels.getLabel("relatorioEstornoCartaoController.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();

				filtro.append("Início período: ");
				Calendar cal = Calendar.getInstance();
				cal.setTime(datInicial.getValue());
				filtro.append(cal.get(Calendar.DATE) + "/");
				filtro.append((cal.get(Calendar.MONTH) + 1) + "/");
				filtro.append(cal.get(Calendar.YEAR) + "; ");

				filtro.append("Fim período: ");
				cal.setTime(datFinal.getValue());
				filtro.append(cal.get(Calendar.DATE) + "/");
				filtro.append((cal.get(Calendar.MONTH) + 1) + "/");
				filtro.append(cal.get(Calendar.YEAR) + "; ");

				parametros.put("DATA_INICIAL", datInicial.getValue());
				parametros.put("DATA_FINAL", datFinal.getValue());
				parametros.put("NOME_RELATORIO", Labels.getLabel("relatorioEstornoCartaoController.window.title"));
				parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
				parametros.put("USUARIO_NOME", UsuarioLogado.getUsuarioLogado().getNombusuario());
				parametros.put("CARTAO", txtCartao.getValue());
				parametros.put("DOCUMENTO_CPF", txtCpf.getValue());

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

				filtro.append("Agência: ");
				String puntoVentas = "";
				List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(puntoVentaSelList.getData()));
				if (lsPuntoVentaSelecionados.isEmpty()) {
					puntoVentas = "Todas";
				} else {
					StringBuilder puntoVentaIds = new StringBuilder();
					for (int i = 0; i < lsPuntoVentaSelecionados.size(); i++) {
						PuntoVenta puntoVenta = lsPuntoVentaSelecionados.get(i);
						puntoVentas = puntoVentas + puntoVenta.getNombpuntoventa() + ",";
						if(puntoVentaIds.length() > 0) {
							puntoVentaIds.append(",");
						}
						puntoVentaIds.append(puntoVenta.getPuntoventaId());
					}
					parametros.put("NUMPUNTOVENTA", puntoVentaIds.toString());
				}
				filtro.append(puntoVentas).append(";");
				
				FormaPago formaPago =  cmbFormaPago.getSelectedItem() != null ? (FormaPago) cmbFormaPago.getSelectedItem().getValue() : null;
				
				filtro.append(" Forma de Pagamento: ");
				if(formaPago != null) {
					parametros.put("FORMA_PAGO", formaPago.getFormapagoId());
					filtro.append(formaPago.getDescpago()).append(";");
				} else {
					filtro.append(" Todos;");
				}
				
				
				parametros.put("FILTROS", filtro.toString());
				relatorio = new RelatorioEstornoCartao(parametros, dataSourceRead.getConnection());

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

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

	private void executarPesquisa() {
		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);

		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$btnPesquisa(Event ev) {
		executarPesquisa();
	}

	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 datInicial
	 */
	public Datebox getDatInicial() {
		return datInicial;
	}

	/**
	 * @param datInicial
	 *            the datInicial to set
	 */
	public void setDatInicial(Datebox datInicial) {
		this.datInicial = datInicial;
	}

	/**
	 * @return the datFinal
	 */
	public Datebox getDatFinal() {
		return datFinal;
	}

	/**
	 * @param datFinal
	 *            the datFinal to set
	 */
	public void setDatFinal(Datebox datFinal) {
		this.datFinal = datFinal;
	}

	/**
	 * @return the cmbEmpresa
	 */
	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

	/**
	 * @param cmbEmpresa
	 *            the cmbEmpresa to set
	 */
	public void setCmbEmpresa(MyComboboxEstandar cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

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

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

	/**
	 * @return the pagingPuntoVenta
	 */
	public Paging getPagingPuntoVenta() {
		return pagingPuntoVenta;
	}

	/**
	 * @param pagingPuntoVenta
	 *            the pagingPuntoVenta to set
	 */
	public void setPagingPuntoVenta(Paging pagingPuntoVenta) {
		this.pagingPuntoVenta = pagingPuntoVenta;
	}

	/**
	 * @return the txtNombrePuntoVenta
	 */
	public MyTextbox getTxtNombrePuntoVenta() {
		return txtNombrePuntoVenta;
	}

	/**
	 * @param txtNombrePuntoVenta
	 *            the txtNombrePuntoVenta to set
	 */
	public void setTxtNombrePuntoVenta(MyTextbox txtNombrePuntoVenta) {
		this.txtNombrePuntoVenta = txtNombrePuntoVenta;
	}

	/**
	 * @return the puntoVentaList
	 */
	public MyListbox getPuntoVentaList() {
		return puntoVentaList;
	}

	/**
	 * @param puntoVentaList
	 *            the puntoVentaList to set
	 */
	public void setPuntoVentaList(MyListbox puntoVentaList) {
		this.puntoVentaList = puntoVentaList;
	}

	/**
	 * @return the puntoVentaSelList
	 */
	public MyListbox getPuntoVentaSelList() {
		return puntoVentaSelList;
	}

	/**
	 * @param puntoVentaSelList
	 *            the puntoVentaSelList to set
	 */
	public void setPuntoVentaSelList(MyListbox puntoVentaSelList) {
		this.puntoVentaSelList = puntoVentaSelList;
	}

	/**
	 * @return the txtCpf
	 */
	public MyTextbox getTxtCpf() {
		return txtCpf;
	}

	/**
	 * @return the txtCartao
	 */
	public MyTextbox getTxtCartao() {
		return txtCartao;
	}

	/**
	 * @param txtCpf
	 *            the txtCpf to set
	 */
	public void setTxtCpf(MyTextbox txtCpf) {
		this.txtCpf = txtCpf;
	}

	/**
	 * @param txtCartao
	 *            the txtCartao to set
	 */
	public void setTxtCartao(MyTextbox txtCartao) {
		this.txtCartao = txtCartao;
	}
	
	public List<FormaPago> getLsFormaPago() {
		return lsFormaPago;
	}

	public void setLsFormaPago(List<FormaPago> lsFormaPago) {
		this.lsFormaPago = lsFormaPago;
	}

	public Combobox getCmbFormaPago() {
		return cmbFormaPago;
	}

	public void setCmbFormaPago(Combobox cmbFormaPago) {
		this.cmbFormaPago = cmbFormaPago;
	}
}
