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.RelatorioBoletos;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("relatorioBoletosController")
@Scope("prototype")
public class RelatorioBoletosController extends MyGenericForwardComposer {

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

		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();	
		
		if (datInicial.getValue() == null && datFinal.getValue() == null
	     && baixaInicial.getValue() == null && baixaFinal.getValue() == null ) {
			Clients.alert(Labels.getLabel("indexController.mniRelatorioBoletos.msgDatasObrigatorias"), 
					Labels.getLabel("relatorioBoletosController.window.title"), org.zkoss.zul.Messagebox.ERROR);
			return;
		}
		
		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);
		}		
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		
		if (datInicial.getValue() != null && datFinal.getValue() != null) {
			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 relatorio.
			if (dias > 360) {
				Clients.alert(Labels.getLabel("indexController.mniRelatorioBoletos.msgValidacaoDatas"), 
						Labels.getLabel("relatorioBoletosController.window.title"), org.zkoss.zul.Messagebox.ERROR);
				return;
			}
			
			filtro.append("Fechamento: ")
					.append(DateUtil.getStringDate(datInicial.getValue(), "dd/MM/yyyy"))
					.append(" - ")
					.append(DateUtil.getStringDate(datFinal.getValue(), "dd/MM/yyyy"))
					.append(";");
			parametros.put("fecInicio", sdf.format(this.datInicial.getValue()));
			parametros.put("fecFinal", sdf.format(this.datFinal.getValue()));	
		}
		
		if (baixaInicial.getValue() != null && baixaFinal.getValue() != null) {		
			filtro.append("Baixa: ")
					.append(DateUtil.getStringDate(baixaInicial.getValue(), "dd/MM/yyyy"))
					.append(" - ")
					.append(DateUtil.getStringDate(baixaFinal.getValue(), "dd/MM/yyyy"))
					.append(";");
			parametros.put("baixaInicial", sdf.format(this.baixaInicial.getValue()));
			parametros.put("baixaFinal", sdf.format(this.baixaFinal.getValue()));	
		}		
		
		parametros.put("TITULO", Labels.getLabel("indexController.mniRelatorioBoletos.label"));
		parametros.put("usuario_nome", UsuarioLogado.getUsuarioLogado().getNombusuario());
		parametros.put("FILTROS", filtro.toString());
		
		Relatorio relatorio = new RelatorioBoletos(parametros, dataSourceRead.getConnection());

		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

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

	}

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