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

import java.text.SimpleDateFormat;
import java.util.HashMap;
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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.api.Datebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDepositos;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioDepositosNovo;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("relatorioDepositosController")
@Scope("prototype")
public class RelatorioDepositosController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private DataSource dataSourceRead;
	
    private Datebox datInicial;
    private Datebox datFinal;
    private Combobox cmbPuntoventa;
    private Combobox cmbEmpresa;
    private Checkbox chkFiltrarPendentes;
	private Checkbox chkClassificarBanco;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		chkFiltrarPendentes.setChecked(true);
		chkClassificarBanco.setDisabled(false);
	}
	
	private void executarRelatorio() throws Exception {

		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();	
		
		filtro.append("Empresa: ");
		if (cmbEmpresa.getSelectedIndex() != -1){
			Empresa empresa = ((Empresa)cmbEmpresa.getSelectedItem().getValue());
			parametros.put("empresaId", empresa.getEmpresaId());
			filtro.append(empresa.getNombempresa() + ";");
		}else {
			filtro.append(" Todas; ");
		}
		
		filtro.append("Ponto de Venda: ");
		if (cmbPuntoventa.getSelectedIndex() != -1){
			PuntoVenta puntoVenta = ((PuntoVenta)cmbPuntoventa.getSelectedItem().getValue());
			parametros.put("puntoventaId", puntoVenta.getPuntoventaId());
			filtro.append(puntoVenta.getNombpuntoventa() + ";");
		}else {
			filtro.append(" Todos; ");
		}
		
		if (chkFiltrarPendentes.isChecked()){
			parametros.put("filtrarPendentes", true);
		}
		
		int dias = DateUtil.diferencaEntreDatasEmdias(this.datInicial.getValue(), this.datFinal.getValue());
		// Periodo maior que 360 dias (1 ano), para não deixar um range de daods muito grande e não "travar" o relatório.
		if (dias > 360) {
			Clients.alert(Labels.getLabel("indexController.mniRelatorioDepositos.msgValidacaoDatas"), 
					Labels.getLabel("relatorioDepositosController.window.title"), org.zkoss.zul.Messagebox.ERROR);
			return;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		parametros.put("fecInicio", sdf.format(this.datInicial.getValue()));
		parametros.put("fecFinal", sdf.format(this.datFinal.getValue()));
		
		parametros.put("TITULO", Labels.getLabel("indexController.mniRelatorioDepositos.label"));
		parametros.put("FILTROS", filtro.toString());
				
		Relatorio relatorio = null;
		if (chkClassificarBanco.isChecked()) {
			parametros.put("isClassificaPorBanco", true);
			relatorio = new RelatorioDepositosNovo(parametros, dataSourceRead.getConnection());
		}else {
			parametros.put("isClassificaPorBanco", false);
			relatorio = new RelatorioDepositos(parametros, dataSourceRead.getConnection(), "RelatorioDepositos_subreport");
			
		}
		
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

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

	}


	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}
	
	public void onCheck$chkFiltrarPendentes(Event event) {
		if (chkFiltrarPendentes.isChecked()) {
			chkClassificarBanco.setDisabled(false);
		} else {
			chkClassificarBanco.setChecked(false);
			chkClassificarBanco.setDisabled(true);
		}
	}
	
	public Checkbox getChkClassificarBanco() {
		return chkClassificarBanco;
	}

	public void setChkClassificarBanco(Checkbox chkClassificarBanco) {
		this.chkClassificarBanco = chkClassificarBanco;
	}
}
