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

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

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioRDI;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.service.FiscalService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.utilerias.fiscal.vo.FiscalRdi;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEstadoUf;

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

	private static Logger log = LogManager.getLogger(BusquedaRelatorioRDIController.class);

	@Autowired
	private DataSource dataSourceRead;

	@Autowired
	private FiscalService fiscalService;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private EstadoService estadoService;

	private List<Empresa> lsEmpresa;
	private List<Estado> lsEstado;

	private Datebox datInicial;
	private Datebox datFinal;

	private MyComboboxEstandar cmbEmpresa;
	private MyListbox estadoList;

	private Radio radSim;

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

		super.doAfterCompose(comp);

		estadoList.setItemRenderer(new RenderEstadoUf());
		estadoList.setData(lsEstado);
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void executar() throws InterruptedException {

		try {
			Empresa empresa = cmbEmpresa.getSelectedItem() == null ? null : (Empresa) cmbEmpresa.getSelectedItem().getValue();
			List<Estado> estados = new ArrayList<Estado>();
			for (Object ob : estadoList.getSelectedItemsByIndex()) {
				estados.add((Estado) ob);
			}

			if (estados.isEmpty()) {
				Messagebox.show(Labels.getLabel("busquedaRelatorioRDIController.seleciona.estado"),
						Labels.getLabel("indexController.mnImpressaoRMD.label"),
						Messagebox.OK, Messagebox.ERROR);
				return;
			}

			List<FiscalRdi> list = fiscalService.buscarRelatorioRDI(datInicial.getValue(), datFinal.getValue(), empresa, estados, radSim.isChecked());

			Map<String, Object> parametros = new HashMap<String, Object>();
			parametros.put("list", list);
			parametros.put("empresa", empresa.getNombempresa());
			parametros.put("inicio", datInicial.getValue());
			parametros.put("fim", datFinal.getValue());
			parametros.put("estados", estados);
			parametros.put("receitaTerceiros", radSim.isChecked());
			parametros.put("usuario", UsuarioLogado.getUsuarioLogado().getClaveUsuario());

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

			Map args = new HashMap();
			args.put("relatorio", relatorio);

			openWindow("/component/reportView.zul",
					Labels.getLabel("indexController.mnRelatorioRDI.label"), args, MODAL);

		} catch (Exception e) {
			log.error("", e);
			Messagebox.show(e.getMessage(),
					Labels.getLabel("indexController.mnImpressaoRMD.label"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}

	public void onClick$btnExecutar(Event ev) throws InterruptedException {
		executar();
	}

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

	public List<Estado> getLsEstado() {
		return lsEstado;
	}
}
