/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores;

import java.util.Date;
import java.util.List;

import javax.mail.SendFailedException;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
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.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.RecuperarSenha;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.UsuarioService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.SendMail;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("loginController")
@Scope("prototype")
public class LoginController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static final String HOST_SMTP_RECUPERACAOSENHA = "HOST_SMTP_RECUPERACAOSENHA";
	private static final String PORTA_SMTP_RECUPERACAOSENHA = "PORTA_SMTP_RECUPERACAOSENHA";
	private static final String USUARIO_SMTP_RECUPERACAOSENHA = "USUARIO_SMTP_RECUPERACAOSENHA";
	private static final String SENHAUSUARIO_SMTP_RECUPERACAOSENHA = "SENHAUSUARIO_SMTP_RECUPERACAOSENHA";
	private static final String URL_ADM = "URL_ADM";
	private static final String ATIVAR_ADM_RECUPERACAOSENHA = "ATIVAR_ADM_RECUPERACAOSENHA";
	private static Logger log = LogManager.getLogger(LoginController.class);
	
	@Autowired
	private UsuarioService usuarioService;
	
	@Autowired
	private ConstanteService constanteService;

	private Button btnRecuperarSenha;
	
	//login usuario, mantive o nome da tela para nao alterar o processo de login
	private Textbox u;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		Constante ativarRecuperacao = constanteService.buscarPorNomeConstante(ATIVAR_ADM_RECUPERACAOSENHA);
		btnRecuperarSenha.setVisible(ativarRecuperacao == null ? false : Boolean.valueOf(ativarRecuperacao.getValorconstante()));
	}

	public Button getBtnRecuperarSenha() {
		return btnRecuperarSenha;
	}

	public void setBtnRecuperarSenha(Button btnRecuperarSenha) {
		this.btnRecuperarSenha = btnRecuperarSenha;
	}
	
	public void onClick$btnRecuperarSenha(Event ev)  {
		try {
			String login = u.getValue();
			
			if (StringUtils.isBlank(login)) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.camposVazios"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			List<Usuario> usuarioList = usuarioService.buscarPelaCveUsuario(login);
			
			//Nao encontrado nenhum usuario com o login
			if(usuarioList.isEmpty()) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.loginNaoEncontrado"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			if(usuarioList.size() > 1) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.multiplusUsuariosPorLogin"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			Usuario usuario = usuarioList.get(0);

			if(StringUtils.isBlank(usuario.getDescCorreo())) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.emailNaoCadastrado"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			Constante hostSmtp = constanteService.buscarPorNomeConstante(HOST_SMTP_RECUPERACAOSENHA);
			Constante portaSmtp = constanteService.buscarPorNomeConstante(PORTA_SMTP_RECUPERACAOSENHA);
			Constante usuarioSmtp = constanteService.buscarPorNomeConstante(USUARIO_SMTP_RECUPERACAOSENHA);
			Constante senhaUsuarioSMTP = constanteService.buscarPorNomeConstante(SENHAUSUARIO_SMTP_RECUPERACAOSENHA);
			Constante urlADM = constanteService.buscarPorNomeConstante(URL_ADM);
			
			if(isNull(hostSmtp) || isNull(portaSmtp) || isNull(usuarioSmtp) || isNull(senhaUsuarioSMTP) || isNull(urlADM)) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.configuracaoConstante"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			String URL = montarURL(login, urlADM, usuario);
			
			
			enviarEmail(usuario, usuarioSmtp.getValorconstante(), hostSmtp.getValorconstante(), senhaUsuarioSMTP.getValorconstante(), 
					portaSmtp.getValorconstante(), URL);

			Messagebox.show(Labels.getLabel("winCambiaContrasena.MSG.EmailRecuperacaoSenhaEnviado"),
					Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
		} catch (Exception ex) {
			log.error("Erro: ", ex);
			Clients.alert(ex.getLocalizedMessage(), Labels.getLabel("winCambiaContrasena.title"), Messagebox.INFORMATION);
		}
	}

	private String montarURL(String login, Constante urlADM, Usuario usuario) {
		String URL = urlADM.getValorconstante();
		
		String dataAtual = DateUtil.getStringDate24Hour(new Date());
		
		String paramEncode = login.concat(";").concat(dataAtual);
		
		paramEncode = new String(Base64.encodeBase64(paramEncode.getBytes()));
		
		URL = URL.concat("?param=").concat(paramEncode);
		
		salvarParametro(paramEncode, usuario);
		
		return URL;
	}

	private void salvarParametro(String paramEncode, Usuario usuario) {
		RecuperarSenha recSenhaExiste = usuarioService.buscarLinkRecuperacaoSenhaPeloParam(paramEncode);
		
		//Para evitar criar mais de um link no mesmo minuto
		if(recSenhaExiste == null) {
			RecuperarSenha recSenha = new RecuperarSenha();
			
			recSenha.setParam(paramEncode);
			recSenha.setActivo(Boolean.TRUE);
			recSenha.setFecmodif(new Date());
			recSenha.setUsuarioId(usuario.getUsuarioId());
			
			usuarioService.salvarLinkRecuperacaoSenha(recSenha);
		}
	}

	private boolean isNull(Constante valorConstante) {
		return valorConstante == null || StringUtils.isBlank(valorConstante.getValorconstante());
	}

	private void enviarEmail(Usuario usuario, String usuarioSmtp, String smtpHost, String senhaSmtp, String portaSmtp, String urlADM) throws SendFailedException {
		
		SendMail mail = new SendMail();
		mail.setEmailTo(usuario.getDescCorreo());
		mail.setEmailFrom(usuarioSmtp); // "cassiohcsilvadev@gmail.com"
		mail.setSmtpHost(smtpHost); //"smtp.gmail.com"
		mail.setSmtpPassword(senhaSmtp); // "jtzpzyzcjviyheym"
		mail.setSmtpPort(portaSmtp); //"587"
		mail.setSmtpUser(usuarioSmtp); //"cassiohcsilvadev@gmail.com"
		mail.setAuth(true);
		
		//URL: /ventaboletosadm/index.zul?param=USUARIO
		
		String textoEmail = "RECUPERAÇÃO DE SENHA ADM. \n ";
			   textoEmail = textoEmail.concat("Link para recuperacao de senha: " + urlADM + "  \n");
			   textoEmail = textoEmail.concat("O link tem validade de 5 minutos. ");
		
		mail.setSubject("RECUPERAÇÃO DE SENHA ADM.");
		mail.setText(textoEmail);
		mail.send();
	}

	public Textbox getU() {
		return u;
	}

	public void setU(Textbox u) {
		this.u = u;
	}
}
