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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
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.Checkbox;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.MotivoCancelacion;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioGratuidade;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioGratuidadeSimplificado;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.MotivoCancelacionService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

@Controller("relatorioGratuidadeController")
@Scope("prototype")
public class RelatorioGratuidadeController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private OrgaoConcedenteService orgaocConcedenteService;
	@Autowired
	private MotivoCancelacionService motivoCancelacionService;

	private Datebox datInicialViagem;
	private Datebox datFinalViagem;
	private Datebox datInicialVenda;
	private Datebox datFinalVenda;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxPuntoVenta cmbAgencia;
	private MyComboboxEstandar cmbTipoGratuidade;
	private MyComboboxEstandar cmbOrgaoConcedente;
	private MyComboboxEstandar cmbLinha;
	private MyComboboxParada cmbOrigem;
	private MyComboboxParada cmbDestino;

	private List<Empresa> lsEmpresas;
	private List<Categoria> lsCategorias;
	private List<Ruta> lsLinhas;
	
	private MyListbox selectedTipoGratuidadeList;
	private List<Categoria> listSelectedTipoGratuidade;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private Checkbox chkApenasUltimaMovimentacaoBilhete;
	
	
	public void onClick$btnRemoveTipoGratuidade(Event ev) throws InterruptedException {
		Categoria categoria = (Categoria) selectedTipoGratuidadeList.getSelectedItem().getValue();
		listSelectedTipoGratuidade.remove(categoria);
		selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
	}

	public void onClick$btnAddTipoTipoGratuidade(Event ev) throws InterruptedException {
		if (cmbTipoGratuidade.getSelectedItem() != null) {
			listSelectedTipoGratuidade.add((Categoria) cmbTipoGratuidade.getSelectedItem().getValue());
			selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
			selectedTipoGratuidadeList.setSelectedItem(null);
		}
	}
	
	public MyListbox getSelectedTipoGratuidadeList() {
		return selectedTipoGratuidadeList;
	}

	public void setSelectedTipoGratuidadeList(MyListbox selectedTipoGratuidadeList) {
		this.selectedTipoGratuidadeList = selectedTipoGratuidadeList;
	}

	public List<Categoria> getListSelectedTipoGratuidade() {
		return listSelectedTipoGratuidade;
	}

	public void setListSelectedTipoGratuidade(List<Categoria> listSelectedTipoGratuidade) {
		this.listSelectedTipoGratuidade = listSelectedTipoGratuidade;
	}
	

	private void executarRelatorio(boolean isAnalitico) throws Exception {

		Map<String, Object> parametros = new HashMap<String, Object>();

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		
		parametros.put("isAnalitico", true);
		if (this.datInicialViagem.getValue() != null) {
			parametros.put("fecInicioViagem", sdf.format(this.datInicialViagem.getValue()));
		}
		if (this.datFinalViagem.getValue() != null) {
			parametros.put("fecFinalViagem", sdf.format(this.datFinalViagem.getValue()));
		}
		
		if (this.datInicialVenda.getValue() != null) {
			parametros.put("fecInicioVenda", sdf.format(this.datInicialVenda.getValue()));
		}
		if (this.datFinalVenda.getValue() != null) {
			parametros.put("fecFinalVenda", sdf.format(this.datFinalVenda.getValue()));
		}

		if ((parametros.get("fecInicioViagem") != null || parametros.get("fecFinalViagem") != null) &&
				((parametros.get("fecInicioViagem") == null || parametros.get("fecFinalViagem") == null))) {
			Messagebox.show(Labels.getLabel("relatorioGratuidadeController.data.viagem.obrigatoria"),
                    Labels.getLabel("relatorioGratuidadeController.window.title"),
                    Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
				
		if ((parametros.get("fecInicioVenda") != null || parametros.get("fecFinalVenda") != null) &&
				((parametros.get("fecInicioVenda") == null || parametros.get("fecFinalVenda") == null))) {
			Messagebox.show(Labels.getLabel("relatorioGratuidadeController.data.venda.obrigatoria"),
					Labels.getLabel("relatorioGratuidadeController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		if ((parametros.get("fecInicioViagem") == null && parametros.get("datFinalViagem") == null) && 
			(parametros.get("fecInicioVenda") == null && parametros.get("datFinalVenda") == null)) {
			 Messagebox.show(Labels.getLabel("relatorioGratuidadeController.data.obrigatoria"),
                     Labels.getLabel("relatorioGratuidadeController.window.title"),
                     Messagebox.OK, Messagebox.INFORMATION);
			 return;
		}
			
		if (cmbEmpresa.getSelectedIndex() != -1) {
			parametros.put("empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getEmpresaId());
			parametros.put("nomb_empresa", ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getNombempresa());

		}else{
			parametros.put("nomb_empresa", "TODAS" );
		}
		
		if (cmbAgencia.getSelectedIndex() != -1) {
			PuntoVenta puntoVentaAux = (PuntoVenta) cmbAgencia.getSelectedItem().getValue();
			if (!puntoVentaAux.getPuntoventaId().toString().equals("-1")) {
			parametros.put("agencia", puntoVentaAux.getPuntoventaId());
			}
		}
		if (cmbLinha.getSelectedItem() != null) {
			if (!cmbLinha.getSelectedItem().getValue().equals("-1")) {
				parametros.put("ruta", ((Ruta) cmbLinha.getSelectedItem().getValue()).getRutaId());
			}	
		}
		if (cmbOrigem.getSelectedItem() != null) {
			if (!cmbOrigem.getSelectedItem().getValue().equals("-1")) {
				parametros.put("origem", ((Parada) cmbOrigem.getSelectedItem().getValue()).getParadaId());
			}	
		}
		if (cmbDestino.getSelectedItem() != null) {
			if (!cmbDestino.getSelectedItem().getValue().equals("-1")) {
				parametros.put("destino", ((Parada) cmbDestino.getSelectedItem().getValue()).getParadaId());
			}	
		}
		if (cmbTipoGratuidade.getSelectedItem() != null) {
			if (!cmbTipoGratuidade.getSelectedItem().getValue().equals("-1")) {
				parametros.put("categoria", ((Categoria) cmbTipoGratuidade.getSelectedItem().getValue()).getCategoriaId());
			}	
		}

		if (cmbOrgaoConcedente.getSelectedItem() != null) {
			if(!cmbOrgaoConcedente.getSelectedItem().getValue().equals("-1")){
				OrgaoConcedente orgaoConcedente = (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();
				parametros.put("orgao_concedente_id", orgaoConcedente.getOrgaoConcedenteId());
				parametros.put("orgao_concedente_desc", orgaoConcedente.getDescOrgao());
			}
		}
		if(cmbTipoGratuidade.getSelectedIndex() != -1){
			if (listSelectedTipoGratuidade.size() > 0) {
				String categoriasExpression = null;
				for (Categoria c : listSelectedTipoGratuidade) {
					if (listSelectedTipoGratuidade.indexOf(c) == 0) {
						categoriasExpression = c.getCategoriaId().toString();
					} else {
						categoriasExpression += ", " + c.getCategoriaId().toString();
					}
				}
				parametros.put("categoria",categoriasExpression);
			} 
		}
		parametros.put("isApenasUltimaMovimentacaoBilhete", chkApenasUltimaMovimentacaoBilhete.isChecked());
		parametros.put("TITULO", Labels.getLabel("relatorioGratuidadeController.window.title"));
		
		carregarParametroMotivoCancelamentoAlteracaoPoltrona(parametros);
		Relatorio relatorio;
		if(isAnalitico) {
			relatorio = new RelatorioGratuidade(parametros, dataSourceRead.getConnection());
		}else {
			relatorio = new RelatorioGratuidadeSimplificado(parametros, dataSourceRead.getConnection());
		}
			

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

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

	}

	private void carregarParametroMotivoCancelamentoAlteracaoPoltrona(Map<String, Object> parametros) {
		MotivoCancelacion motivoCancelacion = motivoCancelacionService.findByCveSistema(Constantes.CVESISTEMA_MOTIVO_CANCELAMENTO_ALTERACAO_POLTRONA);
		if(motivoCancelacion != null) {
			parametros.put("mcAlteracaoPoltrona", motivoCancelacion.getMotivocancelacionId());
		}
	}

	public void onClick$btnExecutarRelatorioAnalitico(Event ev) throws Exception {
		executarRelatorio(true);
	}
	public void onClick$btnExecutarRelatorioSimplificado(Event ev) throws Exception {
		executarRelatorio(false);
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {

		super.doAfterCompose(comp);
		
		Boolean isAGER = Boolean.FALSE;
        
        if(arg.get("isAGER") != null){
        	isAGER = (Boolean) arg.get("isAGER");
        }
        
		if (isAGER) {
			lsOrgaoConcedente = orgaocConcedenteService.buscar("AGER/MT");
			if(lsOrgaoConcedente==null ||lsOrgaoConcedente.isEmpty() ) {
				 Messagebox.show(Labels.getLabel("relatorioGratuidadeController.MSG.orgaoAGERNaoCadastradoCorretamente"),
	                     Labels.getLabel("relatorioGratuidadeController.window.title"),
	                     Messagebox.ABORT, Messagebox.INFORMATION);
				 return;
			}
			OrgaoConcedente orgao = lsOrgaoConcedente.get(0);
			cmbOrgaoConcedente.setText(lsOrgaoConcedente.isEmpty() ? "" : orgao.getDescOrgao());
			lsCategorias = categoriaService.buscarCategoriaOrgaoConcedente(orgao.getDescOrgao());
			lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
			lsLinhas = rutaService.buscaRutasFromOrgao(orgao);
		} else {
			lsOrgaoConcedente = orgaocConcedenteService.obtenerTodos();
			lsCategorias = categoriaService.obtenerTodos();
			lsEmpresas = empresaService.obtenerTodos();
			lsLinhas = rutaService.obtenerTodos();
		}

		listSelectedTipoGratuidade = new ArrayList<Categoria>();
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	
	public List<Categoria> getLsCategorias() {
		return lsCategorias;
	}
	public List<Ruta> getLsLinhas() {
		return lsLinhas;
	}

	public void setLsLinhas(List<Ruta> lsLinhas) {
		this.lsLinhas = lsLinhas;
	}
	
	public void setLsCategorias(List<Categoria> lsCategorias) {
		this.lsCategorias = lsCategorias;
	}

	public Datebox getDatInicialViagem() {
		return datInicialViagem;
	}

	public void setDatInicialViagem(Datebox datInicialViagem) {
		this.datInicialViagem = datInicialViagem;
	}

	public Datebox getDatFinalViagem() {
		return datFinalViagem;
	}

	public void setDatFinalViagem(Datebox datFinalViagem) {
		this.datFinalViagem = datFinalViagem;
	}

	public Datebox getDatInicialVenda() {
		return datInicialVenda;
	}

	public void setDatInicialVenda(Datebox datInicialVenda) {
		this.datInicialVenda = datInicialVenda;
	}

	public List<OrgaoConcedente> getLsOrgaoConcedente() {
		return lsOrgaoConcedente;
	}

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}

	public Datebox getDatFinalVenda() {
		return datFinalVenda;
	}

	public void setDatFinalVenda(Datebox datFinalVenda) {
		this.datFinalVenda = datFinalVenda;
	}

	public MyComboboxPuntoVenta getCmbAgencia() {
		return cmbAgencia;
	}

	public void setCmbAgencia(MyComboboxPuntoVenta cmbAgencia) {
		this.cmbAgencia = cmbAgencia;
	}

	public MyComboboxEstandar getCmbTipoGratuidade() {
		return cmbTipoGratuidade;
	}

	public void setCmbTipoGratuidade(MyComboboxEstandar cmbTipoGratuidade) {
		this.cmbTipoGratuidade = cmbTipoGratuidade;
	}

	
}
