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

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtra;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioFinanceiroReceitasDespesas;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioFinanceiroReceitasDespesasAgencia;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioFinanceiroReceitasDespesasEvento;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioFinanceiroReceitasDespesasSintetico;
import com.rjconsultores.ventaboletos.relatorios.receitaDespesa.RelatorioFinanceiroReceitasDespesasBean;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.ReceitaDespesaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
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.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.trg.search.Filter;

/**
 * 
 * @author Lucas
 *
 */
@Controller("relatorioFinanceiroReceitasDespesasController")
@Scope("prototype")
public class RelatorioFinanceiroReceitasDespesasController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	ReceitaDespesaService receitaDespesaService;
	
	private List<Empresa> lsEmpresa;
	private Datebox dataInicial;
	private Datebox dataFinal;
	private Combobox cmbIndTipo;
	private Combobox cmbEmpresa;
	private MyTextbox txtNumDocumento;
	
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	@Autowired
	private transient PagedListWrapper<TipoEventoExtra> plwEventoExtra;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelectedList;
	private MyListbox eventoExtraList;
	private MyListbox eventoExtraSelectedList;
	private Textbox txtPalavraPesquisa;
	private Textbox txtPalavraPesquisaEventoExtra;
	private Paging pagingPuntoVenta;
	private Paging pagingEventoExtra;
	
	private Radio rDetalhado;
	private Radio rSintetico;
	private Radio rAgencia;
	private Radio rEvento;
	
	private Radio rDataVenda;
	private Radio rDataFechamentoCaixa;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		cmbIndTipo.setSelectedIndex(0);
		rDataVenda.setChecked(true);
	}
	
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder sbFiltros = new StringBuilder();
		
		parametros.put("isDataFechamentoCaixa", rDataFechamentoCaixa.isChecked());
		sbFiltros.append(Labels.getLabel("relatorioFinanceiroReceitasDespesasController.lb.filtrarData"));
		if(rDataFechamentoCaixa.isChecked()) {
			sbFiltros.append(": ")
					 .append(Labels.getLabel("relatorioFinanceiroReceitasDespesasController.lb.dataFechamentoCaixa"));
		} else {
			sbFiltros.append(": ")
					 .append(Labels.getLabel("relatorioFinanceiroReceitasDespesasController.lb.filtrarData"));
		}
		sbFiltros.append("; ");
		
		if(dataInicial.getValue() != null) {
			parametros.put("fecInicio", DateUtil.getStringDate(DateUtil.inicioFecha(dataInicial.getValue()), DateUtil.ddMMaaHH24mmss));
			parametros.put("fecInicioFiltro", DateUtil.getStringDate(dataInicial.getValue(), DateUtil.ddMMaaaa));
		}
		if(dataFinal.getValue() != null) {
			parametros.put("fecFinal", DateUtil.getStringDate(DateUtil.fimFecha(dataFinal.getValue()), DateUtil.ddMMaaHH24mmss));
			parametros.put("fecFinalFiltro", DateUtil.getStringDate(dataFinal.getValue(), DateUtil.ddMMaaaa));
		}
		
		if(cmbEmpresa.getSelectedItem() != null) {
			Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
			parametros.put("empresaId", empresa.getEmpresaId());
			parametros.put("nombEmpresa", empresa.getNombempresa());
		}
		
		if(txtNumDocumento.getValue() != null && !txtNumDocumento.getValue().isEmpty() ) {
			parametros.put("numDocumento", txtNumDocumento.getValue());
			sbFiltros.append("Documento: ")
				.append(txtNumDocumento.getValue())
				.append("; ");
		}
		
		sbFiltros.append("Agências: ");
		if(puntoVentaSelectedList.getData() != null && puntoVentaSelectedList.getData().length > 0) {
			List<Object> puntosVenta = Arrays.asList(puntoVentaSelectedList.getData());
			List<Integer> lsPuntoVenta = new ArrayList<Integer>();
			for (Object obj : puntosVenta) {
				PuntoVenta puntoVenta = (PuntoVenta) obj;
				lsPuntoVenta.add(puntoVenta.getPuntoventaId());
				sbFiltros.append(puntoVenta.getNombpuntoventa())
						 .append("; ");
			}
			parametros.put("lsPuntoVenta", lsPuntoVenta);
		} else {
			sbFiltros.append("Todas; ");
		}
		
		sbFiltros.append("Eventos: ");
		if(eventoExtraSelectedList.getData() != null && eventoExtraSelectedList.getData().length > 0) {
			List<Object> eventosExtra = Arrays.asList(eventoExtraSelectedList.getData());
			List<Integer> lsEventosExtra = new ArrayList<Integer>();
			for (Object obj : eventosExtra) {
				TipoEventoExtra eventoExtra = (TipoEventoExtra) obj;
				lsEventosExtra.add(eventoExtra.getTipoeventoextraId());
				sbFiltros.append(eventoExtra.getDescTipoEvento())
						 .append("; ");
			}
			parametros.put("lsEventosExtra", lsEventosExtra);
		} else {
			sbFiltros.append("Todos; ");
		}

		sbFiltros.append("Tipo: ");
		if(cmbIndTipo.getSelectedItem() != null) {
			Integer indTipo = Integer.valueOf((String) cmbIndTipo.getSelectedItem().getValue());
			if(indTipo > -1) {
				parametros.put("indTipo", Integer.valueOf((String) cmbIndTipo.getSelectedItem().getValue()));
			}
			if(RelatorioFinanceiroReceitasDespesasBean.TIPO_CREDITO.equals(indTipo)) {
				sbFiltros.append("Receita; ");
			} else if(RelatorioFinanceiroReceitasDespesasBean.TIPO_DEBITO.equals(indTipo)) {
				sbFiltros.append("Despesa; ");
			} else {
				sbFiltros.append("Todos; ");
			}
		} else {
			sbFiltros.append("Todos; ");
		}
		
		parametros.put("USUARIO", UsuarioLogado.getUsuarioLogado().getClaveUsuario());
		parametros.put("filtros", sbFiltros.toString());
		List<RelatorioFinanceiroReceitasDespesasBean> lsDados = null;
		Relatorio relatorio = null;
		
		if(rDetalhado.isChecked()) {
			lsDados = receitaDespesaService.getRelatorioDetalhado(parametros);
			relatorio = new RelatorioFinanceiroReceitasDespesas(parametros, lsDados);
		} else if(rSintetico.isChecked()) {
			lsDados = receitaDespesaService.getRelatorioSintetico(parametros);
			relatorio = new RelatorioFinanceiroReceitasDespesasSintetico(parametros, lsDados);
		} else if(rAgencia.isChecked()) {
			lsDados = receitaDespesaService.getRelatorioAgencia(parametros);
			relatorio = new RelatorioFinanceiroReceitasDespesasAgencia(parametros, lsDados);
		} else if(rEvento.isChecked()) {
			lsDados = receitaDespesaService.getRelatorioEvento(parametros);
			relatorio = new RelatorioFinanceiroReceitasDespesasEvento(parametros, lsDados);
		}
		
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul",
				   Labels.getLabel("indexController.mniRelatorioVendasComissao.label"), args, MODAL);
		
	}
	
	public void onDoubleClick$puntoVentaList(Event ev) {
		PuntoVenta puntoVentaSel = (PuntoVenta) puntoVentaList.getSelected();
		puntoVentaSelectedList.addItemNovo(puntoVentaSel);
	}

	public void onDoubleClick$puntoVentaSelectedList(Event ev) {
		PuntoVenta puntoVentaSel = (PuntoVenta) puntoVentaSelectedList.getSelected();
		puntoVentaSelectedList.removeItem(puntoVentaSel);
	}
	
	public void onClick$btnLimpar(Event ev) {
		puntoVentaSelectedList.setData(new ArrayList<Object>());
	}
	
	public void onDoubleClick$eventoExtraList(Event ev) {
		TipoEventoExtra eventoExtraSel = (TipoEventoExtra) eventoExtraList.getSelected();
		eventoExtraSelectedList.addItemNovo(eventoExtraSel);
	}
	
	public void onDoubleClick$eventoExtraSelectedList(Event ev) {
		TipoEventoExtra eventoExtraSel = (TipoEventoExtra) eventoExtraSelectedList.getSelected();
		eventoExtraSelectedList.removeItem(eventoExtraSel);
	}
	
	public void onClick$btnLimparEventoExtra(Event ev) {
		eventoExtraSelectedList.setData(new ArrayList<Object>());
	}
	
	public void onClick$btnPesquisa(Event ev) {
		
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda =
				new HibernateSearchObject<PuntoVenta>(PuntoVenta.class,
						pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterOr(Filter.like("nombpuntoventa", "%" + txtPalavraPesquisa.getText().trim().toUpperCase().concat("%")), Filter.like("numPuntoVenta", "%" + txtPalavraPesquisa.getText().trim().toUpperCase().concat("%")));
		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("relatorioReceitaDiariaAgenciaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
		
	}
	
	public void onClick$btnPesquisaEventoExtra(Event ev) {
		
		HibernateSearchObject<TipoEventoExtra> eventoExtraBusqueda =
				new HibernateSearchObject<TipoEventoExtra>(TipoEventoExtra.class,
						pagingEventoExtra.getPageSize());
		
		eventoExtraBusqueda.addFilterOr(Filter.like("descTipoEvento", "%" + txtPalavraPesquisaEventoExtra.getText().trim().toUpperCase().concat("%")));
		eventoExtraBusqueda.addSortAsc("descTipoEvento");
		eventoExtraBusqueda.addFilterEqual("activo", Boolean.TRUE);
		
		plwEventoExtra.init(eventoExtraBusqueda, eventoExtraList, pagingEventoExtra);
		
		if (eventoExtraList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioReceitaDiariaAgenciaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
		
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

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

}
