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

import java.sql.SQLException;
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.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.exception.ComissaoException;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioCalculoComissao;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioReciboComissao;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.SaidaRelatorio;
import com.rjconsultores.ventaboletos.service.CalculoComissaoService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.vo.comissao.HistoricoComissao;
import com.rjconsultores.ventaboletos.vo.comissao.RegistroCalculo;
import com.rjconsultores.ventaboletos.web.utilerias.MaskUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Scope("prototype")
@Controller("busquedaCalculoComissaoController")
public class BusquedaCalculoComissaoController extends MyGenericForwardComposer {

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

	@Autowired
	private CalculoComissaoService calculoComissaoService;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private DataSource dataSourceRead;

	private Combobox cmbEmpresa;
	private List<Empresa> lsEmpresas;
	private List<PuntoVenta> lsPuntoVenta;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private Textbox txtCompetencia;
	private Checkbox chkIgnorarGerados;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		txtCompetencia.focus();
		aplicarMascara();

		lsEmpresas = empresaService.obtenerTodos();
		lsPuntoVenta = new ArrayList<PuntoVenta>();
	}

	public void onClick$btnApagar(Event ev) throws SQLException, InterruptedException {
		txtCompetencia.getValue();
		
		try {
			if(verificarCampos()) {
				PuntoVenta puntoVenta = (PuntoVenta) (cmbPuntoVenta.getSelectedItem() != null ? cmbPuntoVenta.getSelectedItem().getValue() : null);
				Empresa empresa = (Empresa) (cmbEmpresa.getSelectedItem() != null ? cmbEmpresa.getSelectedItem().getValue() : null);
				String competencia = txtCompetencia.getValue();
				Date periodo = DateUtil.getDateFromString("01/"+competencia, "dd/MM/yyyy");

				if(puntoVenta != null && puntoVenta.getPuntoventaId() > -1) {
					calculoComissaoService.cancelarCalculoComissao(puntoVenta.getPuntoventaId(), empresa.getEmpresaId(), periodo);
				} else {
					calculoComissaoService.cancelarCalculoComissao(empresa.getEmpresaId(), periodo);
				}
	
				Messagebox.show(
						Labels.getLabel("busquedaCalculoComissaoController.comissao.msg"),
						Labels.getLabel("busquedaCalculoComissaoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}

		} catch (ComissaoException ce) {
			Messagebox.show(ce.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);

		} catch (Exception e) {
			log.error("", e);
			Messagebox.show(e.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}

	}
	
	private boolean verificarCampos() throws Exception {
		if(!DateUtil.isCompetenciaValida(txtCompetencia.getValue())) {
			Messagebox.show(Labels.getLabel("MSG.Error.invalida.competencia"),
							Labels.getLabel("conferenciaComissaoController.window.title"),
							Messagebox.OK, Messagebox.ERROR);
			
			return false;
		}
		return true;
	}

	public void onClick$btnRelatorio(Event ev) throws SQLException, InterruptedException {
		txtCompetencia.getValue();

		try {
			
			if(verificarCampos()) {
				PuntoVenta puntoVenta = (PuntoVenta) (cmbPuntoVenta.getSelectedItem() != null ? cmbPuntoVenta.getSelectedItem().getValue() : null);
				Empresa empresa = (Empresa) (cmbEmpresa.getSelectedItem() != null ? cmbEmpresa.getSelectedItem().getValue() : null);
				
				String competencia = txtCompetencia.getValue();
				Date periodo = DateUtil.getDateFromString("01/"+competencia, "dd/MM/yyyy");
	
				String subReport = "/com/rjconsultores/ventaboletos/relatorios/templates/RelatorioCalculoComissaoReceitas.jasper";
	
				Map<String, Object> parametros = new HashMap<String, Object>();
				parametros.put("empresa", empresa.getNombempresa());
				parametros.put("periodo", periodo);
				parametros.put("subReport", subReport);
				
				if(puntoVenta != null && puntoVenta.getPuntoventaId() > -1) {
					RegistroCalculo rc = calculoComissaoService.relatorioCalculoComissao(puntoVenta.getPuntoventaId(), empresa.getEmpresaId(), periodo);
					parametros.put("puntoventa", puntoVenta.getNombpuntoventa());
					parametros.put("registroCalculo", rc);
					parametros.put("exibirTotal", Boolean.TRUE);
				} else {
					parametros.put("puntoventa", "Todas");
					List<RegistroCalculo> registrosCalculo = calculoComissaoService.relatorioCalculoComissao(empresa.getEmpresaId(), periodo);
					parametros.put("registrosCalculo", registrosCalculo);
					parametros.put("exibirTotal", Boolean.FALSE);
				}
	
				Relatorio relatorio = new RelatorioCalculoComissao(parametros, dataSourceRead.getConnection());
	
				Map<String, Relatorio> args = new HashMap<String, Relatorio>();
				args.put("relatorio", relatorio);
	
				openWindow("/component/reportView.zul",
						Labels.getLabel("relatorioAcompanhamentoEquivalentesController.window.title"), args, MODAL);
			
			}

		} catch (ComissaoException ce) {
			Messagebox.show(ce.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);

		} catch (Exception e) {
			log.error("", e);
			Messagebox.show(e.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}

	}

	public void onClick$btnRegistrar(Event ev) throws InterruptedException {
		txtCompetencia.getValue();
		
		PuntoVenta puntoVenta = (PuntoVenta) (cmbPuntoVenta.getSelectedItem() != null ? cmbPuntoVenta.getSelectedItem().getValue() : null);
		Empresa empresa = (Empresa) (cmbEmpresa.getSelectedItem() != null ? cmbEmpresa.getSelectedItem().getValue() : null);

		try {
			if(verificarCampos()) {
				String competencia = txtCompetencia.getValue();
				Date periodo = DateUtil.getDateFromString("01/"+competencia, "dd/MM/yyyy");
	
				if(puntoVenta != null && puntoVenta.getPuntoventaId() > -1) {
					calculoComissaoService.registrarCalculoComissao(puntoVenta, empresa, periodo, chkIgnorarGerados.isChecked());
				} else {
					calculoComissaoService.registrarCalculoComissao(empresa, periodo, chkIgnorarGerados.isChecked());
				}
				Messagebox.show(
						Labels.getLabel("busquedaCalculoComissaoController.registro.comissao.msg"),
						Labels.getLabel("busquedaCalculoComissaoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
		} catch (ComissaoException ce) {
			Messagebox.show(ce.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);

		} catch (Exception e) {
			log.error("", e);
			Messagebox.show(e.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}

	}
	
	public void onClick$btnGerarReciboComissao(Event ev) throws SQLException, InterruptedException {
		txtCompetencia.getValue();

		try {
			
			if(verificarCampos()) {
				processarRecibo(false);
			}

		} catch (ComissaoException ce) {
			Messagebox.show(ce.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);

		} catch (Exception e) {
			log.error("", e);
			Messagebox.show(e.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}

	}

	public void onClick$btnEnviarEmailReciboComissao(Event ev) throws SQLException, InterruptedException {
		txtCompetencia.getValue();
		
		try {
			
			if(verificarCampos()) {
				processarRecibo(true);
				
				Messagebox.show(
						Labels.getLabel("busquedaCalculoComissaoController.recibo.email.msg"),
						Labels.getLabel("busquedaCalculoComissaoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
			
		} catch (ComissaoException ce) {
			Messagebox.show(ce.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			
		} catch (Exception e) {
			log.error("", e);
			Messagebox.show(e.getMessage(), Labels.getLabel("busquedaCalculoComissaoController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
		
	}
	
	private void processarRecibo(boolean enviarEmail) throws Exception {
		PuntoVenta puntoVenta = (PuntoVenta) (cmbPuntoVenta.getSelectedItem() != null ? cmbPuntoVenta.getSelectedItem().getValue() : null);
		Empresa empresa = (Empresa) (cmbEmpresa.getSelectedItem() != null ? cmbEmpresa.getSelectedItem().getValue() : null);
		String competencia = txtCompetencia.getValue();

		Map<String, Object> parametros = new HashMap<String, Object>();
		List<HistoricoComissao> recibos = calculoComissaoService.relatorioReciboComissao(puntoVenta != null ? puntoVenta.getPuntoventaId() : null, empresa.getEmpresaId(), competencia);

		if(enviarEmail) {
			for (HistoricoComissao comissao : recibos) {
				if(StringUtils.isNotBlank(comissao.getDescCorreo())) {
					List<HistoricoComissao> recibosEmail = new ArrayList<HistoricoComissao>();
					recibosEmail.add(comissao);
					parametros.put("recibos", recibosEmail);
					Relatorio relatorio = new RelatorioReciboComissao(parametros, dataSourceRead.getConnection());
					calculoComissaoService.enviarEmailReciboComissao(comissao, relatorio.getConteudo(SaidaRelatorio.PDF));
				}
			}
		} else {
			parametros.put("recibos", recibos);
			Relatorio relatorio = new RelatorioReciboComissao(parametros, dataSourceRead.getConnection());
			Map<String, Relatorio> args = new HashMap<String, Relatorio>();
			args.put("relatorio", relatorio);
	
			openWindow("/component/reportView.zul",
				Labels.getLabel("relatorioAcompanhamentoEquivalentesController.window.title"), args, MODAL);
		}
	}

	public void aplicarMascara() {
		MaskUtil.aplicarMascara(txtCompetencia.getUuid(), "99/9999");
	}

	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

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

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

	public List<PuntoVenta> getLsPuntoVenta() {
		return lsPuntoVenta;
	}

	public void setLsPuntoVenta(List<PuntoVenta> lsPuntoVenta) {
		this.lsPuntoVenta = lsPuntoVenta;
	}

	public MyComboboxPuntoVenta getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

	public void setCmbPuntoVenta(MyComboboxPuntoVenta cmbPuntoVenta) {
		this.cmbPuntoVenta = cmbPuntoVenta;
	}

}
