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

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

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.Executions;
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.RecuperarSenha;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.service.UsuarioService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("recuperarSenhaController")
@Scope("prototype")
public class RecuperarSenhaController extends MyGenericForwardComposer {

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

	@Autowired
	private UsuarioService usuarioService;

	private Textbox txtUser;
	private Textbox txtNewPassword;
	private Textbox txtConfirmPassword;
	private Button btnSalvar;
	private Button btnFecharTela;
	
	private RecuperarSenha recSenha;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		String param = (String) Executions.getCurrent().getArg().get("login");
		
		if(param != null) {
			recSenha = usuarioService.buscarLinkRecuperacaoSenhaPeloParam(param);
			
			//Se nao existe no banco nao ativa a troca de senha
			if(recSenha == null) {
				desativarCampos();
			} else {
				btnFecharTela.setVisible(false);
				String paramDecode = new String(Base64.decodeBase64(param.getBytes()));
				
				String[] parametros = paramDecode.split(";");
				
				if(parametros.length != 2) {
					desativarCampos();
				} else {
					
					if(isDataValida(parametros)) {
						txtUser.setText(parametros[0]);
						
					} else {
						desativarCampos();
						btnFecharTela.setLabel("Link expirado. Fechar tela.");
					}
				}
			}
			
		} 
	}

	private void desativarCampos() {
		txtUser.setDisabled(true);
		txtNewPassword.setDisabled(true);
		txtConfirmPassword.setDisabled(true);
		
		btnSalvar.setVisible(false);
		btnFecharTela.setVisible(true);
	}

	private boolean isDataValida(String[] parametros) {
		Date dataParam =DateUtil.getDateString24Hour(parametros[1]);
		
		Date dataAtual = new Date();
		
		Long minutos = DateUtil.getElapsedMinutos(dataParam, dataAtual);
		
		//A data e valida em ate 5 minutos
		return minutos <= 5;
	}

	private void fecharTela() {
		closeWindow();
		openWindow("/login.zul", Labels.getLabel("indexController.app.nome"), arg, MODAL, Boolean.FALSE);
	}
	
	public void onClick$btnFecharTela(Event ev) {
		fecharTela();
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		try {
			
			if (StringUtils.isBlank(txtUser.getValue())) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.camposVazios"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			List<Usuario> usuarioList = usuarioService.buscarPelaCveUsuario(txtUser.getValue());
			
			//Nao encontrado nenhum usuario
			if(usuarioList.isEmpty()) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.camposVazios"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			if (!txtNewPassword.getValue().equals(txtConfirmPassword.getValue())) {
				Messagebox.show(Labels.getLabel("winCambiaContrasena.erro.senhasDiferentes"),
						Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			Usuario usuario = usuarioList.get(0);

			usuarioService.cambiarContrasena(usuario, txtNewPassword.getValue());
			
			//Desativar link
			usuarioService.desativarLinkRecuperacaoSenha(recSenha);

			Messagebox.show(Labels.getLabel("winCambiaContrasena.MSG.suscribirOK"),
					Labels.getLabel("winCambiaContrasena.title"), Messagebox.OK, Messagebox.INFORMATION);
			
			fecharTela();

		} catch (Exception ex) {
			log.error(ex.getLocalizedMessage());
			Clients.alert(ex.getLocalizedMessage(), Labels.getLabel("winCambiaContrasena.title"), Messagebox.INFORMATION);
		}
	}

	public Button getBtnSalvar() {
		return btnSalvar;
	}

	public void setBtnSalvar(Button btnSalvar) {
		this.btnSalvar = btnSalvar;
	}

	public Button getBtnFecharTela() {
		return btnFecharTela;
	}

	public void setBtnFecharTela(Button btnFecharTela) {
		this.btnFecharTela = btnFecharTela;
	}
}
