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

import java.sql.SQLException;
import java.text.SimpleDateFormat;
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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Button;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Radio;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Secretaria;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasRequisicao;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasRequisicaoDetalhado;
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.ConstraintNoEmpty;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxSecretaria;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("relatorioVendasRequisicaoController")
@Scope("prototype")
public class RelatorioVendasRequisicaoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private DataSource dataSourceRead;
	
	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
	
	private Datebox dataInicial;
	private Datebox dataFinal;
	private Boolean isDetalhado = false; 
	
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private MyComboboxSecretaria cmbSecretaria;
	
	// Mantis 15327
	// Radios que vão definir se o relatório será agrupado por cliente ou por ponto de venda
	private Radio radioTipoRelatorioPorCliente;
	private Radio radioTipoRelatorioPorPontoVenda;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		this.lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		this.radioTipoRelatorioPorCliente.setChecked(true);
		this.radioTipoRelatorioPorPontoVenda.setChecked(false);
	}

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

	public void onClick$radioTipoRelatorioPorCliente(Event ev) throws Exception {
		this.radioTipoRelatorioPorCliente.setChecked(true);
		this.radioTipoRelatorioPorPontoVenda.setChecked(false);
		this.cmbPuntoVenta.setConstraint(new ConstraintNoEmpty());
		this.cmbPuntoVenta.getValue();
		this.cmbSecretaria.setConstraint("");
		this.cmbSecretaria.getValue();
	}

	public void onClick$radioTipoRelatorioPorPontoVenda(Event ev) throws Exception {
		this.radioTipoRelatorioPorCliente.setChecked(false);
		this.radioTipoRelatorioPorPontoVenda.setChecked(true);
		this.cmbPuntoVenta.setConstraint("");
		this.cmbPuntoVenta.getValue();
		this.cmbSecretaria.setConstraint(new ConstraintNoEmpty());
		this.cmbSecretaria.getValue();
	}

	public void excutarRelatorios() throws SQLException, Exception {

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

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

		sdf.applyPattern("dd/MM/yyyy HH:mm");
		parametros.put("dataFiltroInicial", sdf.format(DateUtil.inicioFecha(dataDe)));
		parametros.put("dataFiltroFinal", sdf.format(DateUtil.fimFecha(dataAte)));

		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;");
		}
		
		String nombpuntoventa = "";
		String descsecretaria = "";

		Comboitem itemPuntoventa = cmbPuntoVenta.getSelectedItem();
		if(itemPuntoventa != null) {
			PuntoVenta puntoVenta = (PuntoVenta) itemPuntoventa.getValue();
			if(puntoVenta.getPuntoventaId() > -1) {
				nombpuntoventa = puntoVenta.getNombpuntoventa();
				parametros.put("PUNTOVENTA_ID", puntoVenta.getPuntoventaId());
				parametros.put("puntoventa", nombpuntoventa);
			} else {
				parametros.put("puntoventa", "Todas;");
			}
		} else {
			parametros.put("puntoventa", "Todas;");
			
		}
		
		Comboitem itemSecretaria = cmbSecretaria.getSelectedItem();
		if(itemSecretaria != null) {
			Secretaria secretaria = (Secretaria) itemSecretaria.getValue();
			if(secretaria.getSecretariaId() > -1) {
				descsecretaria = secretaria.getDescsecretaria();
				parametros.put("SECRETARIA_ID", secretaria.getSecretariaId());
				parametros.put("secretaria", secretaria.getDescsecretaria());
			} else {
				parametros.put("secretaria", "Todas;");
			}
		} else {
			parametros.put("secretaria", "Todas;");
		}

		if (radioTipoRelatorioPorCliente.isChecked()) {
			parametros.put("CABECALHO_AGRUPAMENTO_LABEL", Labels.getLabel("lb.puntoventa"));
			parametros.put("CABECALHO_AGRUPAMENTO_DESCRICAO", nombpuntoventa);
			parametros.put("AGRUPAMENTO_LABEL", Labels.getLabel("relatorioVendasRequisicaoController.cliente.label"));
		} else if (radioTipoRelatorioPorPontoVenda.isChecked()) {
			parametros.put("CABECALHO_AGRUPAMENTO_LABEL", Labels.getLabel("relatorioVendasRequisicaoController.cliente.label"));
			parametros.put("CABECALHO_AGRUPAMENTO_DESCRICAO", descsecretaria);
			parametros.put("AGRUPAMENTO_LABEL", Labels.getLabel("lb.puntoventa"));
		}

		Map<String, Object> args = new HashMap<String, Object>();
		if(isDetalhado) {
			Relatorio relatorio = new RelatorioVendasRequisicaoDetalhado(parametros, dataSourceRead.getConnection(), radioTipoRelatorioPorCliente.isChecked());
			args.put("relatorio", relatorio);
			openWindow("/component/reportView.zul",
					Labels.getLabel("indexController.mniRelatorioVendasRequisicao.Detalhado.label"), args, MODAL);
		} else {
			Relatorio relatorio = new RelatorioVendasRequisicao(parametros, dataSourceRead.getConnection(), radioTipoRelatorioPorCliente.isChecked());
			args.put("relatorio", relatorio);
			openWindow("/component/reportView.zul",
					Labels.getLabel("indexController.mniRelatorioVendasRequisicao.label"), args, MODAL);
		}

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

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

}
