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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.zk.ui.event.EventListener;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timebox;

import com.rjconsultores.ventaboletos.entidad.Corrida;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.GrupoRuta;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhasHorario;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhasHorarioSimpData;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhasHorarioSimplificado;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.CorridaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.GrupoRutaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCorridaOrigemDestino;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioLinhaHorarioRuta;

@Controller("relatorioLinhasHorarioController")
@Scope("prototype")
public class RelatorioLinhasHorarioController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(RelatorioLinhasHorarioController.class);

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private CorridaService corridaService;

	@Autowired
	private RutaService rutaService;

	@Autowired
	private GrupoRutaService grupoRutaService;

	private Datebox datInicial;
	private Datebox datFinal;

	private Combobox cmbEmpresa;
	private List<Empresa> lsEmpresa;

	private Combobox cmbGrupoRuta;
	private List<GrupoRuta> lsGrupoRuta;

	private MyListbox linhaList;
	private MyListbox linhaListSelList;
	private Textbox txtPalavraPesquisaLinha;

	private ArrayList<Ruta> lsNumLinha = new ArrayList<Ruta>();
	private MyListbox servicoList;
	private MyListbox servicoListSelList;
	private Intbox txtCorridaId;

	private ArrayList<Corrida> lsNumServico = new ArrayList<Corrida>();

	private Radio rdOrdinario;
	private Radio rdExtraOrdinario;
	private Radio rdTodos;
	private Checkbox chkSimplificado;
	private Checkbox chkSimplificadoPorData;
	private Checkbox chkConisederarTXPedagio;
		
	private Timebox horaInicial;
	private Timebox horaFinal;
	private Checkbox chkIndSentidoIda;
	private Checkbox chkIndSentidoVolta;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void executarRelatorio() throws Exception {

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

		Integer tipoServico = null;
		try {
			if (rdOrdinario.isSelected()) {
				tipoServico = Integer.parseInt(rdOrdinario.getValue());
			}
			if (rdExtraOrdinario.isSelected()) {
				tipoServico = Integer.parseInt(rdExtraOrdinario.getValue());
			}
			if (rdTodos.isSelected()) {
				tipoServico = Integer.parseInt(rdTodos.getValue());
			}
		} catch (Exception e) {
			log.debug(e.getMessage());
		}

		parametros.put("TIPOSERVICIO_ID", tipoServico);

		parametros.put("DATA_INICIO", DateUtil.inicioFecha(this.datInicial.getValue()));
		parametros.put("DATA_FINAL", DateUtil.fimFecha(this.datFinal.getValue()));
		
		parametros.put("ISSIMPLIFICADO", chkSimplificado.isChecked());
		parametros.put("ISPORDATA", chkSimplificadoPorData.isChecked());
		parametros.put("USUARIO_ID", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("NOME_USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario().toString());
		
		
		Empresa empresa = null;
		try {
			empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		} catch (Exception e) {
			log.debug(e.getMessage());
		}
		parametros.put("EMPRESA", empresa);


		GrupoRuta grupoRuta = null;
		try {
			grupoRuta = (GrupoRuta) cmbGrupoRuta.getSelectedItem().getValue();
		} catch (Exception e) {
			log.debug(e.getMessage());
		}
		parametros.put("GRUPORUTA", grupoRuta);

		if (grupoRuta != null) {
			parametros.put("DESCGRUPO", grupoRuta.getDescGrupo());
		} else {
			parametros.put("DESCGRUPO", "TODOS");
		}
		
		if (empresa != null) {
			parametros.put("NOMBEMPRESA", empresa.getNombempresa());
		} else {
			parametros.put("NOMBEMPRESA", "TODOS");
		}

		lsNumLinha = new ArrayList(Arrays.asList(linhaListSelList.getData()));
		lsNumServico = new ArrayList(Arrays.asList(servicoListSelList.getData()));
		parametros.put("lsNumLinha", lsNumLinha);
		parametros.put("lsNumServico", lsNumServico);
		Relatorio relatorio = null;
		String tituloRelatorio = "";
		if(!chkSimplificado.isChecked() && !chkSimplificadoPorData.isChecked()) {
			relatorio = new RelatorioLinhasHorario(parametros, dataSourceRead.getConnection());
			tituloRelatorio = "relatorioLinhasHorarioController.window.title";
		}else {
			if(horaInicial.getValue() != null){
				parametros.put("HORA_INICIAL", horaInicial.getValue());
			}
			if(horaFinal.getValue()!= null){
				parametros.put("HORA_FINAL", horaFinal.getValue());
			}
			parametros.put("ISSENTIDOIDA", chkIndSentidoIda.isChecked());
			parametros.put("ISSENTIDOVOLTA", chkIndSentidoVolta.isChecked() );
			parametros.put("ISPORDATA",chkSimplificadoPorData.isChecked() );
			if (!chkSimplificadoPorData.isChecked()) {
				if (chkConisederarTXPedagio.isChecked()){
					relatorio = new RelatorioLinhasHorarioSimplificadoConsiderarTaxaPedagio(parametros, dataSourceRead.getConnection());	
				}else {
					relatorio = new RelatorioLinhasHorarioSimplificado(parametros, dataSourceRead.getConnection());
				}	
			} else {
				if (chkConisederarTXPedagio.isChecked()){
					relatorio = new RelatorioLinhasHorarioSimpDataConsiderarTaxaPedagio(parametros, dataSourceRead.getConnection());
				}else {
					relatorio = new RelatorioLinhasHorarioSimpData(parametros, dataSourceRead.getConnection());
				}	
			}
			
			tituloRelatorio = "relatorioLinhasHorarioSimplificadoController.window.title";
			
		}

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

		openWindow("/component/reportView.zul",
				Labels.getLabel(tituloRelatorio), args, MODAL);

	}

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

	public void onClick$btnPesquisaLinha(Event ev) {
		executarPesquisaLinha();
	}

	public void onClick$btnLimparLinha(Event ev) {
		linhaList.clearSelection();
		lsNumLinha.clear();
	}

	public void onDoubleClick$servicoList(Event ev) {
		Corrida corridaAux = (Corrida) servicoList.getSelected();
		servicoListSelList.addItemNovo(corridaAux);
	}

	public void onDoubleClick$linhaList(Event ev) {
		Ruta rutaAux = (Ruta) linhaList.getSelected();
		linhaListSelList.addItemNovo(rutaAux);
	}

	private void executarPesquisaLinha() {

		String palavraPesquisaRuta = txtPalavraPesquisaLinha.getText();
		linhaList.setData(rutaService.buscaRuta(palavraPesquisaRuta));

		if (linhaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioLinhasHorarioController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	private void executarPesquisaServico() {

		Integer corridaId = txtCorridaId.getValue();
		servicoList.setData(corridaService.buscarGroupCorrridaId(corridaId, datInicial.getValue(), datFinal.getValue()));

		if (servicoList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioLinhasHorarioController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	public void onClick$btnLimparServico(Event ev) {
		servicoList.clearSelection();
		servicoList.setData(new ArrayList<Corrida>());
		lsNumServico.clear();
	}

	public void onClick$btnPesquisaServico(Event ev) {
		executarPesquisaServico();
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresa = empresaService.obtenerTodos();

		lsGrupoRuta = grupoRutaService.obtenerTodos();

		linhaList.setItemRenderer(new RenderRelatorioLinhaHorarioRuta());
		linhaListSelList.setItemRenderer(new RenderRelatorioLinhaHorarioRuta());

		servicoList.setItemRenderer(new RenderCorridaOrigemDestino());
		servicoListSelList.setItemRenderer(new RenderCorridaOrigemDestino());
		chkConisederarTXPedagio.setDisabled(true);
		chkSimplificado.addEventListener("onCheck", new EventListener()  {
		    public void onEvent(Event event) {
		        boolean isChecked = chkSimplificado.isChecked();
		        
		        if (isChecked) {
		            chkSimplificadoPorData.setChecked(false);
		            chkSimplificadoPorData.setDisabled(true);
		            chkConisederarTXPedagio.setChecked(false);
		            chkConisederarTXPedagio.setDisabled(false);
		        } else if (!isChecked) {
		            chkSimplificadoPorData.setDisabled(false);
		            chkConisederarTXPedagio.setChecked(false);
		            chkConisederarTXPedagio.setDisabled(true);
		        }
		    }
		});

		chkSimplificadoPorData.addEventListener("onCheck", new EventListener() {
		    public void onEvent(Event event) {
		        boolean isChecked = chkSimplificadoPorData.isChecked();
		        
		        if (isChecked ) {
		            chkSimplificado.setChecked(false);
		            chkSimplificado.setDisabled(true);
		            chkConisederarTXPedagio.setChecked(false);
		            chkConisederarTXPedagio.setDisabled(false);
		        } else if (!isChecked) {
		        	chkSimplificado.setDisabled(false);
		        	chkConisederarTXPedagio.setChecked(false);
		        	chkConisederarTXPedagio.setDisabled(true);
		        }
		    }
		});
	}
	
	

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

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

	public List<GrupoRuta> getLsGrupoRuta() {
		return lsGrupoRuta;
	}

	public void setLsGrupoRuta(List<GrupoRuta> lsGrupoRuta) {
		this.lsGrupoRuta = lsGrupoRuta;
	}
}
