package com.rjconsultores.ventaboletos.web.gui.controladores.seguridad.contingencia;

import static com.rjconsultores.ventaboletos.web.gui.controladores.seguridad.contingencia.EditarContigenciaController.TITULO_CONTIGENCIA_CONTROLLER;

import java.util.HashMap;

import javax.mail.AuthenticationFailedException;
import javax.mail.SendFailedException;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zkplus.spring.SpringUtil;

import com.rjconsultores.ventaboletos.entidad.EmpresaEmail;
import com.rjconsultores.ventaboletos.entidad.LogHistoricoContingencia;
import com.rjconsultores.ventaboletos.enums.EStatusContingencia;
import com.rjconsultores.ventaboletos.service.ContingenciaService;
import com.rjconsultores.ventaboletos.service.EmpresaEmailService;
import com.rjconsultores.ventaboletos.web.utilerias.MensagensUtils;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

public class EventListenerOnClickContingenciaBotaoContingencia implements EventListener {
	
	private static Logger log = LogManager.getLogger(EventListenerOnClickContingenciaBotaoContingencia.class);
	
	private MyGenericForwardComposer controller;
	
	public EventListenerOnClickContingenciaBotaoContingencia(MyGenericForwardComposer controller) {
		this.controller = controller;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Override
	public void onEvent(Event arg0) throws Exception {
		if (!isContigenciaValida()) {
			return;
		}
		
		if (EStatusContingencia.CONTINGENCIA.equals(getStatusContingencia())) {
			log.info("SETAR CONTIGENCIA");
			HashMap args = new HashMap();
			args.put("controller", getController());
			args.put("eventoPai", this);
			getController().openWindow("/gui/seguridad/agreementContingencia.zul",
					Labels.getLabel(TITULO_CONTIGENCIA_CONTROLLER), args, MyGenericForwardComposer.MODAL);
		} else {
			log.info("RETIRAR CONTIGENCIA");
			gravaLogHistoricoContingencia();
		}
	}

	protected void gravaLogHistoricoContingencia() {
		try {
			LogHistoricoContingencia logHistoricoContigencia = configuraLogHistoricoContigencia();
			getContingenciaService().salvarHistoricoContingencia(logHistoricoContigencia);
			MensagensUtils.showMessageInformation("Status alterado com sucesso.", TITULO_CONTIGENCIA_CONTROLLER);
			getController().buscarHistoricoContigencia();
		} catch (SendFailedException e2 ) {
			//Para exceção de envio de email apresenta mensagem mas coloca em contingencia
			MensagensUtils.showMessageExclamation("Foi alterada para contingência porém não será enviado email. Motivo: " + e2.getMessage(), TITULO_CONTIGENCIA_CONTROLLER);
			getController().buscarHistoricoContigencia();
		}catch (AuthenticationFailedException e2) {
			//Para exceção de  autenticação no envio de email apresenta mensagem mas coloca em contingência
			MensagensUtils.showMessageExclamation("Foi alterada para contingência porém não será enviado email. Motivo: " + e2.getMessage(), TITULO_CONTIGENCIA_CONTROLLER);
			getController().buscarHistoricoContigencia();
		} catch (Exception e) {
			log.error("Não foi possível alterar a contingencia: " , e);
			MensagensUtils.showMessageError("Não foi possível alterar a contingencia: " + e.getMessage(), TITULO_CONTIGENCIA_CONTROLLER);
		}
	}
	
	private LogHistoricoContingencia configuraLogHistoricoContigencia() {
		LogHistoricoContingencia logHistoricoContingencia = new LogHistoricoContingencia();
		logHistoricoContingencia.setStatus(getController().getNovoStatus());
		logHistoricoContingencia.setEmpresa(getController().getEmpresaSelecionada());
		logHistoricoContingencia.setEstado(getController().getEstadoSelecionado());
		logHistoricoContingencia.setAmbiente(Integer.valueOf(getController().getRdbGroup().getSelectedItem().getValue()));
		logHistoricoContingencia.setMotivo(getController().getTxtMotivo().getValue().trim());
		
		return logHistoricoContingencia;
	}

	private boolean isContigenciaValida() {
		if (StringUtils.isBlank(getController().getTxtMotivo().getValue())) {
			MensagensUtils.showMessageExclamation("É necessário inserir o motivo da operação para continuar.", TITULO_CONTIGENCIA_CONTROLLER);
			return false;
		}
		
		if (destinatarioNuloQuandoEmContingencia()) {
			MensagensUtils.showMessageExclamation("Não será possível enviar o e-mail de confirmação de contingência pois as configurações do menu de Catalogo>Empresa>Configuração de Envio de e-mail estão inválidas. Favor definir o responsável pelo envio e recebimento do e-mail no menu Catalogo>Empresa>Configuração de Envio de e-mail no ADM, preenchendo todas as informações.", TITULO_CONTIGENCIA_CONTROLLER);
			return true;
		}
		
		return true;
	}

	private boolean destinatarioNuloQuandoEmContingencia() {
		EmpresaEmail empresaMail = getEmpresaEmailService().buscarPorEmpresa(getController().getEmpresaSelecionada());
		return (empresaMail == null || StringUtils.isBlank(empresaMail.getDestinatario()))
				&& getController().getNovoStatus().equals(EStatusContingencia.CONTINGENCIA.getId().toString());
	}

	private EStatusContingencia getStatusContingencia() {
		return EStatusContingencia.getStatusContingencia(Integer.valueOf(getController().getNovoStatus()));
	}

	private EmpresaEmailService getEmpresaEmailService() {
		return (EmpresaEmailService) SpringUtil.getBean("empresaEmailService");
	}

	private ContingenciaService getContingenciaService() {
		return (ContingenciaService) SpringUtil.getBean("contingenciaService");
	}

	public EditarContigenciaController getController() {
		return (EditarContigenciaController)controller;
	}

}
