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

import java.io.IOException;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

import javax.sql.DataSource;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.xml.sax.SAXException;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Datebox;

import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.PagedListGenerico;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.ValidarDatas;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.web.utilerias.MensagensUtils;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEmpresa;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRutaPersonalizado;

@Controller("relatorioExportacaoSGTIController")
@Scope("prototype")
public class RelatorioExportacaoSGTIController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	protected static final int ORGAO_CONCEDENTE_DER_MG = 6;
	
	private static final String TITULO_EXPORTACAO = "indexController.mniRelatorioExportacaoSGTI.label";
	private static final String MSG_DATA_INICIAL_MAIOR_FINAL = "relatorioExportacaoSGTIController.MSG.dataInicialMaiorFinal";
	private static final String MSG_MESES_DIFERENTES = "relatorioExportacaoSGTIController.MSG.mesDiferente";
	private static final String MSG_SEM_LINHA = "relatorioExportacaoSGTIController.MSG.semLinha";
	private static final String MSG_ERRO_SEM_EMPRESA = "relatorioExportacaoSGTIController.msg.erro.empresa";
	
	private MyComboboxEmpresa cbEmpresa;
	private Datebox dataInicial;
	private Datebox dataFinal;
	private MyListbox linhaList;
	private MyListbox linhaSelList;
	private MyTextbox txtPalavraPesquisaLinha;
	private MyTextbox txtObservacao;
	
	@Autowired
	private RutaService rutaService;
	
	@Autowired
	private DataSource dataSourceRead;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		List<String> colunasLinhaRender = Arrays.asList("numRuta", "prefixo", "descruta");
		linhaList.setItemRenderer(new RenderRutaPersonalizado(colunasLinhaRender));
		linhaSelList.setItemRenderer(new RenderRutaPersonalizado(colunasLinhaRender).comBotaoExcluir());
	}
	
	public void onClick$btnPesquisaLinha(Event ev) {
		OrgaoConcedente orgaoConcedente = new OrgaoConcedente();
		orgaoConcedente.setOrgaoConcedenteId(ORGAO_CONCEDENTE_DER_MG);
		linhaList.setData(rutaService.buscaRuta(txtPalavraPesquisaLinha.getText(), orgaoConcedente));
		PagedListGenerico.validarPagedListSemRegistro(linhaList, TITULO_EXPORTACAO);
	}

	public void onClick$btnLimparLinha(Event ev) {
		PagedListGenerico.limparPesquisaListBox(linhaList, txtPalavraPesquisaLinha);
	}
	
	public void onDoubleClick$linhaSelList(Event ev) {
		linhaSelList.removeItem((Ruta) linhaSelList.getSelected());
	}

	public void onDoubleClick$linhaList(Event ev) {
		PagedListGenerico.validarInclusaoLista((Ruta) linhaList.getSelected(), linhaSelList);
	}
	
	public void onClick$btnExecutarExportacao(Event ev) throws TransformerException, SAXException, IOException, ParserConfigurationException, SQLException {
		if (isDatasValidas() && possuiEmpresa() 
				&& possuiLinha()) {
			new ExecutarExportacaoSGTI(this, dataSourceRead.getConnection()).executa();
		}
	}

	private boolean possuiEmpresa() {
		if (cbEmpresa.getSelectedItem() == null) {
			MensagensUtils.showMessageInformation(MSG_ERRO_SEM_EMPRESA, TITULO_EXPORTACAO);
			return false;
		}
		return true;
	}

	private boolean possuiLinha() {
		if (linhaSelList.getSize() == 0) {
			MensagensUtils.showMessageInformation(MSG_SEM_LINHA, TITULO_EXPORTACAO);
			return false;
		}
		return true;
	}

	private boolean isDatasValidas() {
		ValidarDatas validarDatas = new ValidarDatas(dataInicial, dataFinal);
		
		if (!validarDatas.isMesmoMes()) {
			MensagensUtils.showMessageInformation(MSG_MESES_DIFERENTES, TITULO_EXPORTACAO);
			return false;
		}
		
		return !validarDatas.validarDataInicioMaiorQueTermino(MSG_DATA_INICIAL_MAIOR_FINAL, TITULO_EXPORTACAO);
	}
	
	public MyComboboxEmpresa getCbEmpresa() {
		return cbEmpresa;
	}

	public Datebox getDataInicial() {
		return dataInicial;
	}

	public Datebox getDataFinal() {
		return dataFinal;
	}

	public MyListbox getLinhaSelList() {
		return linhaSelList;
	}
	
	public MyTextbox getTxtObservacao() {
		return txtObservacao;
	}

}
