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

import java.text.SimpleDateFormat;
import java.util.ArrayList;
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.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.enums.RelatorioMovimentacaoBilheteStatusEnum;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioMovimentacaoBilhete;
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.web.utilerias.MensagensUtils;
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;

//Mantis 15134

@Controller("relatorioMovimentacaoBilheteController")
@Scope("prototype")
@SuppressWarnings("serial")
public class RelatorioMovimentacaoBilheteController extends MyGenericForwardComposer {

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private CategoriaService categoriaService;

	@Autowired
	private RutaService rutaService;

	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;

	@Autowired
	private MotivoCancelacionService motivoCancelacionService;

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

	private List<Empresa> lsEmpresas;
	private List<Categoria> lsCategorias;
	private List<Ruta> lsLinhas;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private List<RelatorioMovimentacaoBilheteStatusEnum> lsStatus;
	private List<Categoria> listSelectedTipoGratuidade;
	private MyListbox selectedTipoGratuidadeList;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		lsEmpresas = empresaService.obtenerTodos();
		lsCategorias = categoriaService.obtenerTodos();
		lsLinhas = rutaService.obtenerTodos();
		lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
		lsStatus = RelatorioMovimentacaoBilheteStatusEnum.getListaOrdenada();
		listSelectedTipoGratuidade = new ArrayList<Categoria>();
	}
	
	public void onClick$btnRemoveTipoGratuidade(Event ev) {
		Categoria categoria = (Categoria) selectedTipoGratuidadeList.getSelectedItem().getValue();
		listSelectedTipoGratuidade.remove(categoria);
		selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
	}

	public void onClick$btnAddTipoTipoGratuidade(Event ev) {
		if (cmbTipoGratuidade.getSelectedItem() != null) {
			listSelectedTipoGratuidade.add((Categoria) cmbTipoGratuidade.getSelectedItem().getValue());
			selectedTipoGratuidadeList.setData(listSelectedTipoGratuidade);
			selectedTipoGratuidadeList.setSelectedItem(null);
		}
	}
	
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}

	private void executarRelatorio() throws Exception {
		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("TITULO", Labels.getLabel("relatorioMovimentacaoBilheteController.window.title"));

		// Datas
		putParametrosDate(parametros, "fecInicioViagem", this.datInicialViagem.getValue());
		putParametrosDate(parametros, "fecFinalViagem", this.datFinalViagem.getValue());
		putParametrosDate(parametros, "fecInicioVenda", this.datInicialVenda.getValue());
		putParametrosDate(parametros, "fecFinalVenda", this.datFinalVenda.getValue());

		// validação datas
		if (parametros.containsKey("fecInicioViagem") && !parametros.containsKey("fecFinalViagem") || !parametros.containsKey("fecInicioViagem") && parametros.containsKey("fecFinalViagem")) {
			MensagensUtils.showMessageInformation(Labels.getLabel("relatorioMovimentacaoBilheteController.data.viagem.obrigatoria"), Labels.getLabel("relatorioMovimentacaoBilheteController.window.title"));
			return;
		}
				
		if (parametros.containsKey("fecInicioVenda") && !parametros.containsKey("fecFinalVenda") || !parametros.containsKey("fecInicioVenda") && parametros.containsKey("fecFinalVenda")) {
			MensagensUtils.showMessageInformation(Labels.getLabel("relatorioMovimentacaoBilheteController.data.venda.obrigatoria"), Labels.getLabel("relatorioMovimentacaoBilheteController.window.title"));
			return;
		}
		
		if (!parametros.containsKey("fecInicioViagem") && !parametros.containsKey("fecFinalViagem") && !parametros.containsKey("fecInicioVenda") && !parametros.containsKey("fecFinalVenda")) {
			MensagensUtils.showMessageInformation(Labels.getLabel("relatorioMovimentacaoBilheteController.data.obrigatoria"), Labels.getLabel("relatorioMovimentacaoBilheteController.window.title"));
			return;
		}

		// Empresa
		if (cmbEmpresa.getSelectedIndex() != -1) {
			Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
			parametros.put("empresa_id", empresa.getEmpresaId());
			parametros.put("nomb_empresa", empresa.getNombempresa());
		} else {
			parametros.put("nomb_empresa", "TODAS" );
		}
		
		// Agência
		if (cmbAgencia.getSelectedIndex() != -1) {
			parametros.put("agencia_id", ((PuntoVenta) cmbAgencia.getSelectedItem().getValue()).getPuntoventaId());
		}

		// Linha
		if (cmbLinha.getSelectedIndex() != -1) {
			parametros.put("ruta_id", ((Ruta) cmbLinha.getSelectedItem().getValue()).getRutaId());
		}

		// Origem
		if (cmbOrigem.getSelectedIndex() != -1) {
			parametros.put("origem_id", ((Parada) cmbOrigem.getSelectedItem().getValue()).getParadaId());
		}

		// Destino
		if (cmbDestino.getSelectedIndex() != -1) {
			parametros.put("destino_id", ((Parada) cmbDestino.getSelectedItem().getValue()).getParadaId());
		}

		// orgão Concedente
		if (cmbOrgaoConcedente.getSelectedIndex() != -1) {
			OrgaoConcedente orgaoConcedente = (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();
			parametros.put("orgao_concedente_id", orgaoConcedente.getOrgaoConcedenteId());
			parametros.put("orgao_concedente_desc", orgaoConcedente.getDescOrgao());
		}

		// Status
		if (cmbStatus.getSelectedIndex() != -1) {
			parametros.put("status", (RelatorioMovimentacaoBilheteStatusEnum) cmbStatus.getSelectedItem().getValue());
		}

		// Tipos de Passagens
		if (!listSelectedTipoGratuidade.isEmpty()) {
			String categoriasExpression = null;

			for (Categoria c : listSelectedTipoGratuidade) {
				if (listSelectedTipoGratuidade.indexOf(c) == 0) {
					categoriasExpression = c.getCategoriaId().toString();
				} else {
					categoriasExpression += ", " + c.getCategoriaId().toString();
				}
			}

			parametros.put("categoria_id", categoriasExpression);
		} else if (cmbTipoGratuidade.getSelectedIndex() != -1) {
			parametros.put("categoria_id", ((Categoria) cmbTipoGratuidade.getSelectedItem().getValue()).getCategoriaId().toString());
		}
		
		carregarParametroMotivoCancelamentoAlteracaoPoltrona(parametros);

		Relatorio relatorio = new RelatorioMovimentacaoBilhete(parametros, dataSourceRead.getConnection());

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

		openWindow("/component/reportView.zul", Labels.getLabel("relatorioMovimentacaoBilheteController.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());
		}
	}

	private void putParametrosDate(Map<String, Object> parametros, String nomeParametros, Date data) {
		if (data != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			parametros.put(nomeParametros, sdf.format(data));
		}
	}

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

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

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

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

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

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

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

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

	public List<RelatorioMovimentacaoBilheteStatusEnum> getLsStatus() {
		return lsStatus;
	}

	public void setLsStatus(List<RelatorioMovimentacaoBilheteStatusEnum> lsStatus) {
		this.lsStatus = lsStatus;
	}
}